<?xml version="1.0"?>
<rss version="2.0"><channel><title>Tutorials Latest Topics</title><link>https://rage.mp/forums/forum/43-tutorials/</link><description>Tutorials Latest Topics</description><language>en</language><item><title>[UPDATED] Sirens Silencer</title><link>https://rage.mp/forums/topic/995-updated-sirens-silencer/</link><description><![CDATA[<p>
	Hello Guys,<br /><br />
	Welcome again to another tutorial. Today i'm going to introduce to you guys the <strong>Sirens Silencer.</strong>
</p>

<p>
	If you want to be stealth and raid the criminals without they notice you, this will be your solution.
</p>

<p>
	The script is very simple.<br />
	 
</p>

<p>
	When player enters a Emergency Vehicle, the script will work by pressing B. The silencer is also saved for future uses if you park yours car and took another one and then came back. The silencer will be waiting you.
</p>

<p>
	<span style="font-size:18px;">Server-side:</span>
</p>

<div class="ipsSpoiler" data-ipsspoiler="">
	<div class="ipsSpoiler_header">
		<span>Spoiler</span>
	</div>

	<div class="ipsSpoiler_contents">
		<pre class="ipsCode prettyprint lang-javascript prettyprinted">

<span class="pln">mp</span><span class="pun">.</span><span class="pln">events</span><span class="pun">.</span><span class="pln">add</span><span class="pun">(</span><span class="str">'syncSirens'</span><span class="pun">,</span><span class="pln"> </span><span class="pun">(</span><span class="pln">player</span><span class="pun">,</span><span class="pln"> vehicle</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">vehicle </span><span class="pun">&amp;&amp;</span><span class="pln"> mp</span><span class="pun">.</span><span class="pln">vehicles</span><span class="pun">.</span><span class="pln">exists</span><span class="pun">(</span><span class="pln">vehicle</span><span class="pun">.</span><span class="pln">id</span><span class="pun">))</span><span class="pln"> vehicle</span><span class="pun">.</span><span class="pln">setVariable</span><span class="pun">(</span><span class="str">'silentMode'</span><span class="pun">,</span><span class="pln"> </span><span class="pun">!</span><span class="pln">vehicle</span><span class="pun">.</span><span class="pln">getVariable</span><span class="pun">(</span><span class="str">'silentMode'</span><span class="pun">))</span><span class="pln">
</span><span class="pun">});</span></pre>

		<p>
			 
		</p>
	</div>
</div>

<p>
	<span style="font-size:16px;">Client-side:</span>
</p>

<div class="ipsSpoiler" data-ipsspoiler="">
	<div class="ipsSpoiler_header">
		<span>Spoiler</span>
	</div>

	<div class="ipsSpoiler_contents">
		<pre class="ipsCode prettyprint lang-javascript prettyprinted">

<span class="kwd">let</span><span class="pln"> localPlayer </span><span class="pun">=</span><span class="pln"> mp</span><span class="pun">.</span><span class="pln">players</span><span class="pun">.</span><span class="pln">local</span><span class="pun">;</span><span class="pln">

mp</span><span class="pun">.</span><span class="pln">keys</span><span class="pun">.</span><span class="pln">bind</span><span class="pun">(</span><span class="lit">0x42</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">,</span><span class="pln"> _ </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">localPlayer</span><span class="pun">.</span><span class="pln">vehicle </span><span class="pun">&amp;&amp;</span><span class="pln"> localPlayer</span><span class="pun">.</span><span class="pln">vehicle</span><span class="pun">.</span><span class="pln">getPedInSeat</span><span class="pun">(-</span><span class="lit">1</span><span class="pun">)</span><span class="pln"> </span><span class="pun">===</span><span class="pln"> localPlayer</span><span class="pun">.</span><span class="pln">handle </span><span class="pun">&amp;&amp;</span><span class="pln"> localPlayer</span><span class="pun">.</span><span class="pln">vehicle</span><span class="pun">.</span><span class="pln">getClass</span><span class="pun">()</span><span class="pln"> </span><span class="pun">===</span><span class="pln"> </span><span class="lit">18</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        localPlayer</span><span class="pun">.</span><span class="pln">vehicle</span><span class="pun">.</span><span class="pln">getVariable</span><span class="pun">(</span><span class="str">'silentMode'</span><span class="pun">)</span><span class="pln"> </span><span class="pun">?</span><span class="pln"> mp</span><span class="pun">.</span><span class="pln">game</span><span class="pun">.</span><span class="pln">graphics</span><span class="pun">.</span><span class="pln">notify</span><span class="pun">(`</span><span>Silent</span><span class="pln"> mode is deactivated</span><span class="pun">.`)</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> mp</span><span class="pun">.</span><span class="pln">game</span><span class="pun">.</span><span class="pln">graphics</span><span class="pun">.</span><span class="pln">notify</span><span class="pun">(`</span><span>Silent</span><span class="pln"> mode is activated</span><span class="pun">.`);</span><span class="pln">
        mp</span><span class="pun">.</span><span class="pln">events</span><span class="pun">.</span><span class="pln">callRemote</span><span class="pun">(</span><span class="str">'syncSirens'</span><span class="pun">,</span><span class="pln"> localPlayer</span><span class="pun">.</span><span class="pln">vehicle</span><span class="pun">)</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">});</span><span class="pln">

mp</span><span class="pun">.</span><span class="pln">events</span><span class="pun">.</span><span class="pln">add</span><span class="pun">(</span><span class="str">'entityStreamIn'</span><span class="pun">,</span><span class="pln"> </span><span class="pun">(</span><span class="pln">entity</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">entity</span><span class="pun">.</span><span class="pln">type </span><span class="pun">===</span><span class="pln"> </span><span class="str">'vehicle'</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln"> entity</span><span class="pun">.</span><span class="pln">getClass</span><span class="pun">()</span><span class="pln"> </span><span class="pun">===</span><span class="pln"> </span><span class="lit">18</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln"> entity</span><span class="pun">.</span><span class="pln">hasVariable</span><span class="pun">(</span><span class="str">'silentMode'</span><span class="pun">))</span><span class="pln"> entity</span><span class="pun">.</span><span class="pln">getVariable</span><span class="pun">(</span><span class="str">'silentMode'</span><span class="pun">)</span><span class="pln"> </span><span class="pun">?</span><span class="pln"> entity</span><span class="pun">.</span><span class="pln">setSirenSound</span><span class="pun">(</span><span class="kwd">true</span><span class="pun">)</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> entity</span><span class="pun">.</span><span class="pln">setSirenSound</span><span class="pun">(</span><span class="kwd">false</span><span class="pun">);</span><span class="pln">
    
</span><span class="pun">});</span><span class="pln">

mp</span><span class="pun">.</span><span class="pln">events</span><span class="pun">.</span><span class="pln">addDataHandler</span><span class="pun">(</span><span class="str">"silentMode"</span><span class="pun">,</span><span class="pln"> </span><span class="pun">(</span><span class="pln">entity</span><span class="pun">,</span><span class="pln"> value</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">entity</span><span class="pun">.</span><span class="pln">type </span><span class="pun">===</span><span class="pln"> </span><span class="str">"vehicle"</span><span class="pun">)</span><span class="pln"> entity</span><span class="pun">.</span><span class="pln">setSirenSound</span><span class="pun">(</span><span class="pln">value</span><span class="pun">);</span><span class="pln">
</span><span class="pun">});</span></pre>

		<p>
			 
		</p>
	</div>
</div>

<p>
	If you need any help, don't hesitate to post your problem in this topic.<br /><br />
	You're free to use, change, copy this script. (Don't Forget some credits)<br /><br />
	Hope you enjoyed the Tutorial.<br />
	Have a nice day!
</p>

<p>
	Regards,<br />
	Captien.
</p>]]></description><guid isPermaLink="false">995</guid><pubDate>Fri, 01 Dec 2017 15:21:52 +0000</pubDate></item><item><title>CEF Tutorial (Interact with browser pages in RAGEMP client and server)</title><link>https://rage.mp/forums/topic/1896-cef-tutorial-interact-with-browser-pages-in-ragemp-client-and-server/</link><description><![CDATA[
<p style="text-align:center;">
	<span style="color:#00b050;font-size:20pt;">Introduction</span>
</p>

<p>
	<span style="font-size:14pt;">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.</span>
</p>

<p>
	<span style="font-size:14pt;">This tutorial is targeting new comers in RAGEMP but who have background in scripting and know how to run and connect their server locally.</span>
</p>

<p>
	<span style="font-size:14pt;">So the main points will be:</span>
</p>

<p>
	<span style="font-size:14pt;">1-What is CEF</span>
</p>

<p>
	<span style="font-size:14pt;">2-Sending information from CEF to RAGEMP client (and vice versa)</span>
</p>

<p>
	<span style="font-size:14pt;">3-Sending information from RAGEMP to The Server (and vice versa) (I will be using C# Bridge API for working with the serverside scripting) </span>
</p>

<p>
	<span style="font-size:14pt;"> </span>
</p>

<p>
	<span style="font-size:14pt;">Before we start you are going to need the following to better understand the tutorial:</span>
</p>

<p>
	<span style="font-size:14pt;">Basic knowledge in HTML, CSS and JavaScript</span>
</p>

<p>
	<span style="font-size:14pt;"><span> </span>(Optional – Nice to have) Bootstrap and JQuery</span>
</p>

<p>
	<span style="font-size:14pt;">Let’s start!</span>
</p>

<p>
	<span style="font-size:14pt;"> </span>
</p>

<p align="center" style="text-align:center;">
	<span style="color:#00b050;font-size:20pt;">What is CEF</span>
</p>

<p>
	<span style="font-size:14pt;">CEF is abbreviation to Chromium Embedded Framework an open source framework that allow the ability to embed HTML webpages into applications.</span>
</p>

<p>
	<span style="font-size:14pt;">RAGEMP already integrates the CEF so you don’t have to download anything externally to begin using it.</span>
</p>

<p>
	<span style="font-size:14pt;"> </span>
</p>

<p align="center" style="text-align:center;">
	<span style="color:#00b050;font-size:20pt;">CEF and RAGEMP Client</span>
</p>

<p>
	<span style="font-size:14pt;">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.</span>
</p>

<p>
	<span style="font-size:14pt;">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</span>.
</p>

<p>
	<span style="font-size:14pt;">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.</span>
</p>

<p>
	<span style="font-size:14pt;">NOTE: In the Login folder you are going to place the webpage files and all dependences such as Bootstrap or JQuery libraries.</span>
</p>

<p>
	<span style="font-size:14pt;"> </span>
</p>

<p>
	<span style="font-size:14pt;">So to this point you should’ve something similar to this</span>
</p>

<p>
	<img alt="63rScfw.png" class="ipsImage" src="https://i.imgur.com/63rScfw.png" style="width:938px;height:674px;" /></p>

<p>
	<span style="font-size:9pt;">Dependences folder contains the minified JQuery and Bootstrap libraries, Links below:</span>
</p>

<p>
	<span style="font-size:12px;"><a href="https://getbootstrap.com/docs/3.3/getting-started/" rel="external nofollow">https://getbootstrap.com/docs/3.3/getting-started/</a></span>
</p>

<p>
	<span style="font-size:9pt;"><a href="https://code.jquery.com/jquery-3.3.1.min.js/" rel="external nofollow">https://code.jquery.com/jquery-3.3.1.min.js/</a></span>
</p>

<p>
	<span style="font-size:14pt;">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.<span> </span></span>
</p>

<p>
	<span style="font-size:14pt;"><img alt="ZmdoFde.png" class="ipsImage" src="https://i.imgur.com/ZmdoFde.png" style="width:938px;height:449px;" /></span>
</p>

<p>
	<span style="font-size:14pt;">But you can go with any page design you like.</span>
</p>

<p>
	<span style="font-size:10pt;">Disclaimer: I am new to web development so it may not look that good but it does the job.</span>
</p>

<p>
	<span style="font-size:10pt;"> </span>
</p>

<p>
	<span style="font-size:14pt;">Now we need to interact with this page,</span>
</p>

<p>
	<span style="font-size:14pt;">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</span>
</p>

<p>
	<span style="font-size:14pt;"><img alt="DC4L9GM.png" class="ipsImage" src="https://i.imgur.com/DC4L9GM.png" style="width:938px;height:501px;" /></span>
</p>

<p>
	<span style="font-size:14pt;">Also notice how we referenced the “Login.js” script.</span>
</p>

<p>
	<span style="font-size:14pt;">We are going to use these inside our “Login.js” file, so Open the Login.js file and write the following:</span>
</p>

<p>
	<span style="font-size:12px;">(Code is written using JQuery)</span>
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted">
<span class="pln">$</span><span class="pun">(</span><span class="str">'#loginButton'</span><span class="pun">).</span><span class="pln">click</span><span class="pun">(()</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

    mp</span><span class="pun">.</span><span class="pln">trigger</span><span class="pun">(</span><span class="str">'loginInformationToServer'</span><span class="pun">,</span><span class="pln"> $</span><span class="pun">(</span><span class="str">'#loginUsernameText'</span><span class="pun">).</span><span class="pln">val</span><span class="pun">(),</span><span class="pln"> $</span><span class="pun">(</span><span class="str">'#loginPasswordText'</span><span class="pun">).</span><span class="pln">val</span><span class="pun">());</span><span class="pln">
</span><span class="pun">});</span><span class="pln">

$</span><span class="pun">(</span><span class="str">'#registerButton'</span><span class="pun">).</span><span class="pln">click</span><span class="pun">(()</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

    mp</span><span class="pun">.</span><span class="pln">trigger</span><span class="pun">(</span><span class="str">'registerInformationToServer'</span><span class="pun">,</span><span class="pln"> $</span><span class="pun">(</span><span class="str">'#registerUsernameText'</span><span class="pun">).</span><span class="pln">val</span><span class="pun">(),</span><span class="pln"> $</span><span class="pun">(</span><span class="str">'#registerPasswordText'</span><span class="pun">).</span><span class="pln">val</span><span class="pun">());</span><span class="pln">
</span><span class="pun">});</span></pre>

<p>
	<span style="font-size:14pt;">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).</span>
</p>

<p>
	<span style="font-size:14pt;"> </span>
</p>

<p>
	<span style="font-size:14pt;">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.</span>
</p>

<p>
	<span style="font-size:14pt;">Open “Main.js” and use</span><span style="font-size:14pt;"> mp.browsers.new(‘package://path’);</span>
</p>

<p>
	<span style="font-size:14pt;">In our case: we have the html page inside our Login folder.</span>
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted">
<span class="kwd">var</span><span class="pln"> loginBrowser </span><span class="pun">=</span><span class="pln"> mp</span><span class="pun">.</span><span class="pln">browsers</span><span class="pun">.</span><span class="kwd">new</span><span class="pun">(</span><span class="str">'package://Login/Login.html'</span><span class="pun">);</span></pre>

<p>
	<span style="font-size:14pt;">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.</span>
</p>

<p>
	<span style="font-size:14pt;">Let’s catch them now, <span> </span>inside the “Main.js” add the following:</span>
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted">
<span class="pln">mp</span><span class="pun">.</span><span class="pln">events</span><span class="pun">.</span><span class="pln">add</span><span class="pun">(</span><span class="str">'loginInformationToServer'</span><span class="pun">,</span><span class="pln"> </span><span class="pun">(</span><span class="pln">username</span><span class="pun">,</span><span class="pln"> password</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

    mp</span><span class="pun">.</span><span class="pln">events</span><span class="pun">.</span><span class="pln">callRemote</span><span class="pun">(</span><span class="str">'OnPlayerLoginAttempt'</span><span class="pun">,</span><span class="pln"> username</span><span class="pun">,</span><span class="pln"> password</span><span class="pun">);</span><span class="pln">

</span><span class="pun">});</span><span class="pln">

mp</span><span class="pun">.</span><span class="pln">events</span><span class="pun">.</span><span class="pln">add</span><span class="pun">(</span><span class="str">'registerInformationToServer'</span><span class="pun">,</span><span class="pln"> </span><span class="pun">(</span><span class="pln">username</span><span class="pun">,</span><span class="pln"> password</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

    mp</span><span class="pun">.</span><span class="pln">events</span><span class="pun">.</span><span class="pln">callRemote</span><span class="pun">(</span><span class="str">'OnPlayerRegisterAttempt'</span><span class="pun">,</span><span class="pln"> username</span><span class="pun">,</span><span class="pln"> password</span><span class="pun">);</span><span class="pln">

</span><span class="pun">});</span></pre>

<p>
	<span style="font-size:14pt;">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.</span>
</p>

<p>
	<span style="font-size:14pt;"> </span>
</p>

<p>
	<span style="font-size:14pt;">But before we forget go back to the client_packages folder and create or open the file ‘index.js’ and place </span>
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted">
<span class="pln">require</span><span class="pun">(</span><span class="str">'./Login/Main.js'</span><span class="pun">);</span><span class="pln"> </span></pre>

<p>
	<span style="font-size:14pt;">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 <a href="https://wiki.rage.mp/index.php?title=Client-side_functions" rel="">https://wiki.rage.mp/index.php?title=Client-side_functions</a></span>
</p>

<p>
	<span style="font-size:14pt;"> </span>
</p>

<p align="center" style="text-align:center;">
	<span style="color:#00b050;font-size:20pt;">RAGEMP Client and RAGEMP Server</span>
</p>

<p>
	<span style="font-size:14pt;">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.</span>
</p>

<p>
	<span style="font-size:14pt;">It can be done in same ways but different syntax depending on which programming language you are using,</span>
</p>

<p>
	<span style="font-size:14pt;">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.</span>
</p>

<p>
	<span style="font-size:14pt;">So go ahead and inside any resource file that you are using type the following:</span>
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted">
<span class="pln">        </span><span class="pun">[</span><span>RemoteEvent</span><span class="pun">(</span><span class="str">"OnPlayerLoginAttempt"</span><span class="pun">)]</span><span class="pln">
        </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span>OnPlayerLoginAttempt</span><span class="pun">(</span><span>Client</span><span class="pln"> player</span><span class="pun">,</span><span class="pln"> string username</span><span class="pun">,</span><span class="pln"> string password</span><span class="pun">)</span><span class="pln">
        </span><span class="pun">{</span><span class="pln">
            NAPI</span><span class="pun">.</span><span>Util</span><span class="pun">.</span><span>ConsoleOutput</span><span class="pun">(</span><span class="pln">$</span><span class="str">"[Login Attempt] Username {username} | Password: {password}"</span><span class="pun">);</span><span class="pln">

            </span><span class="kwd">if</span><span class="pun">(</span><span class="pln">username </span><span class="pun">==</span><span class="pln"> </span><span class="str">"Max"</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln"> password </span><span class="pun">==</span><span class="pln"> </span><span class="str">"123"</span><span class="pun">)</span><span class="pln">
            </span><span class="pun">{</span><span class="pln">
                player</span><span class="pun">.</span><span>TriggerEvent</span><span class="pun">(</span><span class="str">"LoginResult"</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">);</span><span class="pln">
            </span><span class="pun">}</span><span class="pln">
            </span><span class="kwd">else</span><span class="pln"> player</span><span class="pun">.</span><span>TriggerEvent</span><span class="pun">(</span><span class="str">"LoginResult"</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
        </span><span class="pun">}</span></pre>

<p>
	<span style="font-size:14pt;">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)</span>
</p>

<p>
	<span style="font-size:14pt;">Same thing apply for the register event handle.</span>
</p>

<p>
	<span style="font-size:14pt;"> </span>
</p>

<p>
	<span style="font-size:14pt;">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,</span>
</p>

<p>
	<span style="font-size:14pt;">Add the following:</span>
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted">
<span class="pln">mp</span><span class="pun">.</span><span class="pln">events</span><span class="pun">.</span><span class="pln">add</span><span class="pun">(</span><span class="str">'LoginResult'</span><span class="pun">,</span><span class="pln"> </span><span class="pun">(</span><span class="pln">result</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

    </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">result </span><span class="pun">==</span><span class="pln"> </span><span class="lit">1</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

        </span><span class="com">//Success we destroy the loginBrowser as we don't need it anymore</span><span class="pln">
        loginBrowser</span><span class="pun">.</span><span class="pln">destroy</span><span class="pun">();</span><span class="pln">
        mp</span><span class="pun">.</span><span class="pln">gui</span><span class="pun">.</span><span class="pln">cursor</span><span class="pun">.</span><span class="pln">show</span><span class="pun">(</span><span class="kwd">false</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">);</span><span class="pln">

        mp</span><span class="pun">.</span><span class="pln">gui</span><span class="pun">.</span><span class="pln">chat</span><span class="pun">.</span><span class="pln">push</span><span class="pun">(</span><span class="str">"You have successfully logged in."</span><span class="pun">);</span><span class="pln">

    </span><span class="pun">}</span><span class="pln">

    </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

        </span><span class="com">//Failed we just send a message to the player saying he provided incorrect info</span><span class="pln">
        </span><span class="com">//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</span><span class="pln">

        mp</span><span class="pun">.</span><span class="pln">gui</span><span class="pun">.</span><span class="pln">chat</span><span class="pun">.</span><span class="pln">push</span><span class="pun">(</span><span class="str">'Incorrect password or username.'</span><span class="pun">);</span><span class="pln">

    </span><span class="pun">}</span><span class="pln">

</span><span class="pun">});</span></pre>

<p>
	<span style="font-size:14pt;">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.</span>
</p>

<p>
	<span style="font-size:14pt;">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 </span>
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		Quote
	</div>

	<div class="ipsQuote_contents">
		<p>
			<span style="color:#a31515;font-size:9.5pt;">Incorrect password or username.</span>
		</p>
	</div>
</blockquote>

<p>
	<span style="font-size:14pt;">Then try using the combinations of Max and 123 and you should see </span>
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		Quote
	</div>

	<div class="ipsQuote_contents">
		<p>
			<span style="color:#a31515;font-size:9.5pt;">You have successfully logged in.</span>
		</p>
	</div>
</blockquote>

<p>
	<span style="font-size:14pt;">and the window should disappear.</span>
</p>

<p>
	<span style="font-size:14pt;"> </span>
</p>

<p>
	<span style="font-size:14pt;">Same practice apply to the register I will leave it for you to practice and try to implement that by yourself! Good luck!</span>
</p>

<p align="center" style="text-align:center;">
	<span style="color:#00b050;font-size:20pt;">Summary</span>
</p>

<p>
	<span style="font-size:14pt;">Important things to remember:</span>
</p>

<p>
	<span style="font-size:14pt;">- From CEF browser to RAGEMP client =&gt; mp.trigger caught by mp.events.add</span>
</p>

<p>
	<span style="font-size:14pt;">- From RAGEMP client to RAGEMP server (C#) =&gt; mp.events.callRemote caught by [RemoteEvent()] flag and a function</span>
</p>

<p>
	<span style="font-size:14pt;">Now the other way around:</span>
</p>

<p>
	<span style="font-size:14pt;">- From RAGEMP server (C#) to RAGEMP client =&gt; (Client).TriggerEvent caught by mp.events.add</span>
</p>

<p>
	<span style="font-size:14pt;">- From RAGEMP client to CEF browser =&gt; (Browser).execute</span>
</p>

<p>
	<span style="font-size:10px;"> For more information about the syntax for these you can check the ragemp wiki</span>
</p>

<p>
	<span style="font-size:14pt;">NOTE: Sometimes you don’t need to send anything to the server,</span>
</p>

<p>
	<span style="font-size:14pt;">For example a browser that contains information about your server, you just need to contact between CEF and RAGEMP client.</span>
</p>

<p>
	<span style="font-size:14pt;"> </span>
</p>

<p>
	<span style="font-size:14pt;">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!!</span>
</p>

<p>
	<span style="font-size:14pt;"> </span>
</p>

<p align="center" style="text-align:center;">
	<span style="color:#00b050;font-size:20pt;">The End</span>
</p>

<p>
	<span style="font-size:14pt;">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.</span>
</p>

<p>
	<span style="font-size:14pt;">Also feel free to correct me if there is any suggestions or any syntax/logical errors.</span>
</p>

<p>
	<span style="font-size:14pt;">Happy coding!</span>
</p>

<p>
	 
</p>

<p>
	<span style="font-size:18.6667px;">Files used in this tutorial</span><span style="font-size:14pt;">:</span>
</p>

<p>
	<span style="font-size:14pt;"><a href="https://www.solidfiles.com/v/nYR8xn43j57jv" rel="external nofollow">https://www.solidfiles.com/v/nYR8xn43j57jv</a></span>
</p>
]]></description><guid isPermaLink="false">1896</guid><pubDate>Mon, 09 Jul 2018 12:12:38 +0000</pubDate></item><item><title>Implementing custom name tags</title><link>https://rage.mp/forums/topic/393-implementing-custom-name-tags/</link><description><![CDATA[
<p>
	Hi! I would like to present you a script that makes nametag and hp/armor bar look like GTA:Online's ones.
</p>

<p>
	<img alt="qG0EYnA.png" class="ipsImage" height="781" src="https://i.imgur.com/qG0EYnA.png" width="1200" /></p>

<p>
	<img alt="RLxrVIk.gif" class="ipsImage" src="https://i.imgur.com/RLxrVIk.gif" /></p>

<p>
	 
</p>

<p>
	First, we create variables to configure the tags.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted">
<span class="kwd">const</span><span class="pln"> maxDistance </span><span class="pun">=</span><span class="pln"> </span><span class="lit">25</span><span class="pun">*</span><span class="lit">25</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> width </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.03</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> height </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.0065</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> border </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.001</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> color </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="lit">255</span><span class="pun">,</span><span class="lit">255</span><span class="pun">,</span><span class="lit">255</span><span class="pun">,</span><span class="lit">255</span><span class="pun">];</span></pre>

<p>
	Now disable the default name tags.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted">
<span class="pln">mp</span><span class="pun">.</span><span class="pln">nametags</span><span class="pun">.</span><span class="pln">enabled </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span></pre>

<pre dir="ltr" style="color:#212121;">
<span lang="en" xml:lang="en">Next, draw our name tags.</span></pre>

<pre class="ipsCode prettyprint lang-javascript prettyprinted">
<span class="pln">mp</span><span class="pun">.</span><span class="pln">events</span><span class="pun">.</span><span class="pln">add</span><span class="pun">(</span><span class="str">'render'</span><span class="pun">,</span><span class="pln"> </span><span class="pun">(</span><span class="pln">nametags</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">const</span><span class="pln"> graphics </span><span class="pun">=</span><span class="pln"> mp</span><span class="pun">.</span><span class="pln">game</span><span class="pun">.</span><span class="pln">graphics</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">const</span><span class="pln"> screenRes </span><span class="pun">=</span><span class="pln"> graphics</span><span class="pun">.</span><span class="pln">getScreenResolution</span><span class="pun">(</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
	
    nametags</span><span class="pun">.</span><span class="pln">forEach</span><span class="pun">(</span><span class="pln">nametag </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        let </span><span class="pun">[</span><span class="pln">player</span><span class="pun">,</span><span class="pln"> x</span><span class="pun">,</span><span class="pln"> y</span><span class="pun">,</span><span class="pln"> distance</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> nametag</span><span class="pun">;</span><span class="pln">
		
        </span><span class="kwd">if</span><span class="pun">(</span><span class="pln">distance </span><span class="pun">&lt;=</span><span class="pln"> maxDistance</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">	   
            let scale </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="pln">distance </span><span class="pun">/</span><span class="pln"> maxDistance</span><span class="pun">);</span><span class="pln">
            </span><span class="kwd">if</span><span class="pun">(</span><span class="pln">scale </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">0.6</span><span class="pun">)</span><span class="pln"> scale </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.6</span><span class="pun">;</span><span class="pln">
			
            </span><span class="kwd">var</span><span class="pln"> health </span><span class="pun">=</span><span class="pln"> player</span><span class="pun">.</span><span class="pln">getHealth</span><span class="pun">();</span><span class="pln">
            health </span><span class="pun">=</span><span class="pln"> health </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">100</span><span class="pln"> </span><span class="pun">?</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="pun">((</span><span class="pln">health </span><span class="pun">-</span><span class="pln"> </span><span class="lit">100</span><span class="pun">)</span><span class="pln"> </span><span class="pun">/</span><span class="pln"> </span><span class="lit">100</span><span class="pun">);</span><span class="pln">
		   
            </span><span class="kwd">var</span><span class="pln"> armour </span><span class="pun">=</span><span class="pln"> player</span><span class="pun">.</span><span class="pln">getArmour</span><span class="pun">()</span><span class="pln"> </span><span class="pun">/</span><span class="pln"> </span><span class="lit">100</span><span class="pun">;</span><span class="pln">
			
            y </span><span class="pun">-=</span><span class="pln"> scale </span><span class="pun">*</span><span class="pln"> </span><span class="pun">(</span><span class="lit">0.005</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="pun">(</span><span class="pln">screenRes</span><span class="pun">.</span><span class="pln">y </span><span class="pun">/</span><span class="pln"> </span><span class="lit">1080</span><span class="pun">));</span><span class="pln">
		
            graphics</span><span class="pun">.</span><span class="pln">drawText</span><span class="pun">(</span><span class="pln">player</span><span class="pun">.</span><span class="pln">name</span><span class="pun">.</span><span class="pln">replace</span><span class="pun">(</span><span class="str">'_'</span><span class="pun">,</span><span class="pln"> </span><span class="str">' '</span><span class="pun">),</span><span class="pln"> </span><span class="lit">4</span><span class="pun">,</span><span class="pln"> color</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0.4</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0.4</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">,</span><span class="pln"> x</span><span class="pun">,</span><span class="pln"> y</span><span class="pun">);</span><span class="pln">
			
            </span><span class="kwd">if</span><span class="pun">(</span><span class="pln">mp</span><span class="pun">.</span><span class="pln">game</span><span class="pun">.</span><span class="pln">player</span><span class="pun">.</span><span class="pln">isFreeAimingAtEntity</span><span class="pun">(</span><span class="pln">player</span><span class="pun">.</span><span class="pln">handle</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
                let y2 </span><span class="pun">=</span><span class="pln"> y </span><span class="pun">+</span><span class="pln"> </span><span class="lit">0.042</span><span class="pun">;</span><span class="pln">
				
                </span><span class="kwd">if</span><span class="pun">(</span><span class="pln">armour </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">0</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
                    let x2 </span><span class="pun">=</span><span class="pln"> x </span><span class="pun">-</span><span class="pln"> width </span><span class="pun">/</span><span class="pln"> </span><span class="lit">2</span><span class="pln"> </span><span class="pun">-</span><span class="pln"> border </span><span class="pun">/</span><span class="pln"> </span><span class="lit">2</span><span class="pun">;</span><span class="pln">
					
                    graphics</span><span class="pun">.</span><span class="pln">drawRect</span><span class="pun">(</span><span class="pln">x2</span><span class="pun">,</span><span class="pln"> y2</span><span class="pun">,</span><span class="pln"> width </span><span class="pun">+</span><span class="pln"> border </span><span class="pun">*</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0.0085</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">200</span><span class="pun">);</span><span class="pln">
                    graphics</span><span class="pun">.</span><span class="pln">drawRect</span><span class="pun">(</span><span class="pln">x2</span><span class="pun">,</span><span class="pln"> y2</span><span class="pun">,</span><span class="pln"> width</span><span class="pun">,</span><span class="pln"> height</span><span class="pun">,</span><span class="pln"> </span><span class="lit">150</span><span class="pun">,</span><span class="pln"> </span><span class="lit">150</span><span class="pun">,</span><span class="pln"> </span><span class="lit">150</span><span class="pun">,</span><span class="pln"> </span><span class="lit">255</span><span class="pun">);</span><span class="pln">
                    graphics</span><span class="pun">.</span><span class="pln">drawRect</span><span class="pun">(</span><span class="pln">x2 </span><span class="pun">-</span><span class="pln"> width </span><span class="pun">/</span><span class="pln"> </span><span class="lit">2</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="pun">(</span><span class="lit">1</span><span class="pln"> </span><span class="pun">-</span><span class="pln"> health</span><span class="pun">),</span><span class="pln"> y2</span><span class="pun">,</span><span class="pln"> width </span><span class="pun">*</span><span class="pln"> health</span><span class="pun">,</span><span class="pln"> height</span><span class="pun">,</span><span class="pln"> </span><span class="lit">255</span><span class="pun">,</span><span class="pln"> </span><span class="lit">255</span><span class="pun">,</span><span class="pln"> </span><span class="lit">255</span><span class="pun">,</span><span class="pln"> </span><span class="lit">200</span><span class="pun">);</span><span class="pln">

                    x2 </span><span class="pun">=</span><span class="pln"> x </span><span class="pun">+</span><span class="pln"> width </span><span class="pun">/</span><span class="pln"> </span><span class="lit">2</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> border </span><span class="pun">/</span><span class="pln"> </span><span class="lit">2</span><span class="pun">;</span><span class="pln">
				   
                    graphics</span><span class="pun">.</span><span class="pln">drawRect</span><span class="pun">(</span><span class="pln">x2</span><span class="pun">,</span><span class="pln"> y2</span><span class="pun">,</span><span class="pln"> width </span><span class="pun">+</span><span class="pln"> border </span><span class="pun">*</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> height </span><span class="pun">+</span><span class="pln"> border </span><span class="pun">*</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">200</span><span class="pun">);</span><span class="pln">
                    graphics</span><span class="pun">.</span><span class="pln">drawRect</span><span class="pun">(</span><span class="pln">x2</span><span class="pun">,</span><span class="pln"> y2</span><span class="pun">,</span><span class="pln"> width</span><span class="pun">,</span><span class="pln"> height</span><span class="pun">,</span><span class="pln"> </span><span class="lit">41</span><span class="pun">,</span><span class="pln"> </span><span class="lit">66</span><span class="pun">,</span><span class="pln"> </span><span class="lit">78</span><span class="pun">,</span><span class="pln"> </span><span class="lit">255</span><span class="pun">);</span><span class="pln">
                    graphics</span><span class="pun">.</span><span class="pln">drawRect</span><span class="pun">(</span><span class="pln">x2 </span><span class="pun">-</span><span class="pln"> width </span><span class="pun">/</span><span class="pln"> </span><span class="lit">2</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="pun">(</span><span class="lit">1</span><span class="pln"> </span><span class="pun">-</span><span class="pln"> armour</span><span class="pun">),</span><span class="pln"> y2</span><span class="pun">,</span><span class="pln"> width </span><span class="pun">*</span><span class="pln"> armour</span><span class="pun">,</span><span class="pln"> height</span><span class="pun">,</span><span class="pln"> </span><span class="lit">48</span><span class="pun">,</span><span class="pln"> </span><span class="lit">108</span><span class="pun">,</span><span class="pln"> </span><span class="lit">135</span><span class="pun">,</span><span class="pln"> </span><span class="lit">200</span><span class="pun">);</span><span class="pln">
                </span><span class="pun">}</span><span class="pln">
                </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
                    graphics</span><span class="pun">.</span><span class="pln">drawRect</span><span class="pun">(</span><span class="pln">x</span><span class="pun">,</span><span class="pln"> y2</span><span class="pun">,</span><span class="pln"> width </span><span class="pun">+</span><span class="pln"> border </span><span class="pun">*</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> height </span><span class="pun">+</span><span class="pln"> border </span><span class="pun">*</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">200</span><span class="pun">);</span><span class="pln">
                    graphics</span><span class="pun">.</span><span class="pln">drawRect</span><span class="pun">(</span><span class="pln">x</span><span class="pun">,</span><span class="pln"> y2</span><span class="pun">,</span><span class="pln"> width</span><span class="pun">,</span><span class="pln"> height</span><span class="pun">,</span><span class="pln"> </span><span class="lit">150</span><span class="pun">,</span><span class="pln"> </span><span class="lit">150</span><span class="pun">,</span><span class="pln"> </span><span class="lit">150</span><span class="pun">,</span><span class="pln"> </span><span class="lit">255</span><span class="pun">);</span><span class="pln">
                    graphics</span><span class="pun">.</span><span class="pln">drawRect</span><span class="pun">(</span><span class="pln">x </span><span class="pun">-</span><span class="pln"> width </span><span class="pun">/</span><span class="pln"> </span><span class="lit">2</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="pun">(</span><span class="lit">1</span><span class="pln"> </span><span class="pun">-</span><span class="pln"> health</span><span class="pun">),</span><span class="pln"> y2</span><span class="pun">,</span><span class="pln"> width </span><span class="pun">*</span><span class="pln"> health</span><span class="pun">,</span><span class="pln"> height</span><span class="pun">,</span><span class="pln"> </span><span class="lit">255</span><span class="pun">,</span><span class="pln"> </span><span class="lit">255</span><span class="pun">,</span><span class="pln"> </span><span class="lit">255</span><span class="pun">,</span><span class="pln"> </span><span class="lit">200</span><span class="pun">);</span><span class="pln">
                </span><span class="pun">}</span><span class="pln">
            </span><span class="pun">}</span><span class="pln">
        </span><span class="pun">}</span><span class="pln">
    </span><span class="pun">})</span><span class="pln">
</span><span class="pun">})</span></pre>

<p>
	<span style="color:#212121;">This script should be put in the <strong>client_packages </strong>folder and connected to index.js.</span>
</p>
]]></description><guid isPermaLink="false">393</guid><pubDate>Sun, 21 May 2017 12:46:53 +0000</pubDate></item><item><title>[Part 1] Setting up a development environment [NodeJS/VSC]</title><link>https://rage.mp/forums/topic/5103-part-1-setting-up-a-development-environment-nodejsvsc/</link><description><![CDATA[<p>
	<strong><u>Because of the RageMP downtime for the 1.47 update, i wanted to make a tutorial. Here it is!</u></strong>
</p>

<p>
	<em>Sorry for my english, im German <span><img alt=":D" data-emoticon="" height="20" src="https://rage.mp/uploads/emoticons/biggrin.png" srcset="https://rage.mp/uploads/emoticons/biggrin@2x.png 2x" title=":D" width="20" /></span></em>
</p>

<p>
	<strong>Step 1: Downloading Stuff</strong>
</p>

<p>
	Visual Studio Code: <a href="https://code.visualstudio.com" rel="external nofollow">https://code.visualstudio.com</a>
</p>

<p>
	NodeJS (Download the Windows Installer): <a href="https://nodejs.org/en/download/" rel="external nofollow">https://nodejs.org/en/download/</a>
</p>

<p>
	When you got everthing, install it.
</p>

<p>
	<strong>Step 2: Setting up development environment</strong>
</p>

<p>
	Go to<em> C:/RAGEMP/server-files/packages</em> (or where you installed RAGEMP).
</p>

<p>
	Rightclick and Select "Open with Code".
</p>

<p>
	Minimize the Window.
</p>

<p>
	Now Shift+Rightclick in the /packages directory and select "Open Powershell".
</p>

<p>
	Type in 
</p>

<pre class="ipsCode">
npm init</pre>

<p>
	You can leave everything blank at the moment.
</p>

<p>
	Now, type in:
</p>

<pre style="background-color:#f6f8fa;color:#24292e;font-size:13.6px;padding:16px;">
npm install --save-dev github:CocaColaBear/types-ragemp-s#master</pre>

<p>
	This will install the types for auto-complete.
</p>

<p>
	Once it's done, you can close powershell, and restart VSC. (Make sure you open VSC with rightclick in <em>/packages.)</em>
</p>

<p>
	Now you have an nice workspace to getting started!
</p>

<p>
	<strong>(Optional) Setting up for client-side</strong>
</p>

<p>
	For <em>client-packages </em>its almost the same. But, here for you:
</p>

<p>
	Go to<em> C:/RAGEMP/server-files/client-packages</em>(or where you installed RAGEMP).
</p>

<p>
	Rightclick and Select "Open with Code".
</p>

<p>
	Minimize the Window.
</p>

<p>
	Now Shift+Rightclick in the /packages directory and select "Open Powershell".
</p>

<p>
	Type in 
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="pln">npm init</span></pre>

<p>
	You can leave everything blank at the moment.
</p>

<p>
	Now, type in:
</p>

<pre style="background-color:#f6f8fa;color:#24292e;font-size:13.6px;padding:16px;">
npm install --save-dev github:CocaColaBear/types-ragemp-c#master</pre>

<p>
	This will install the types for auto-complete.
</p>

<p>
	Once it's done, you can close powershell, and restart VSC. (Make sure you open VSC with rightclick in <em>/client-packages.)</em>
</p>

<p>
	Now you have the same for client-side!
</p>

<p>
	 
</p>

<p>
	For Questions, PM me or DM on Discord (@Elias#2919)
</p>

<p>
	 
</p>]]></description><guid isPermaLink="false">5103</guid><pubDate>Tue, 23 Jul 2019 23:20:50 +0000</pubDate></item><item><title>[Tutorial/Guide] Entity Framework Core + MySQL (C#) - 0.3.7!</title><link>https://rage.mp/forums/topic/3099-tutorialguide-entity-framework-core-mysql-c-037/</link><description><![CDATA[<p style="text-align:center;">
	 
</p>

<p style="text-align:center;">
	<span style="font-size:22px;"><strong>Hello everyone!</strong></span>
</p>

<p>
	 
</p>

<p>
	<span style="font-size:14px;">Many of you have decided to use Entity Framework instead of raw SQL but failed somehow in the process (myself included)! This is why I am creating this quick guide with some examples on how to use Entity Framework Core with MySQL database in RAGEMP C# gamemode. It's not perfect, but it will work just fine. If you find a mistake or have a better way of doing something, please let me know!</span>
</p>

<p>
	 
</p>

<p style="text-align:center;">
	<span style="font-size:18px;"><strong>L﻿et's start!</strong></span>
</p>

<p>
	<br /><span style="font-size:16px;"><strong>Requirements:</strong></span>
</p>

<p>
	<span style="font-size:16px;">- </span><span style="font-size:14px;">Visual Studio 17 or better</span><br />
	- Net Core 2.2<br /><span style="font-size:14px;">- RageMP C# 0.3.7 <br />
	- MySQL database (I use XAMPP)</span><br />
	 
</p>

<p>
	<span style="color:#2980b9;"><strong>1.</strong></span> <strong>First, you will need some dependencies. Open up the nuget package manager and add these dependencies to your project:</strong>
</p>

<ul><li>
		Microsoft.EntityFrameworkCore - Version 2.2.0
	</li>
	<li>
		Microsoft.EntityFrameworkCore.Tools - Version 2.2.0
	</li>
	<li>
		Pomelo.EntityFrameworkCore.MySql - Version 2.1.4
	</li>
	<li>
		Pomelo.EntityFrameworkCore.MySql.Design - Version 1.1.2
	</li>
</ul><p>
	<u>Pomelo.EntityFrameworkCore.MySql is a MySQL provider. There are many more providers, but Pomelo's is just fine.</u>
</p>

<p>
	 
</p>

<p>
	How it looks when everything's added:
</p>

<p>
	<img alt="pIk7v5E.png" class="ipsImage" height="213" width="346" src="https://i.imgur.com/pIk7v5E.png" /></p>

<p>
	 
</p>

<p>
	<u>NOTE: As of writing this, you have to use exactly those versions I had screenshot above!</u>
</p>

<p>
	 
</p>

<p>
	<strong><span style="color:#2980b9;">2</span>.</strong> <strong>Now we are ready to create a DbContext class. I will just copy and paste and explain needed with comments!</strong>
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted">
<span class="pln">    </span><span class="kwd">using</span><span class="pln"> </span><span class="typ">System</span><span class="pun">;</span><span class="pln"> 
    </span><span class="kwd">using</span><span class="pln"> </span><span class="typ">System</span><span class="pun">.</span><span class="typ">Collections</span><span class="pun">.</span><span class="typ">Generic</span><span class="pun">;</span><span class="pln"> 
    </span><span class="kwd">using</span><span class="pln"> </span><span class="typ">System</span><span class="pun">.</span><span class="typ">Reflection</span><span class="pun">;</span><span class="pln"> 
    </span><span class="kwd">using</span><span class="pln"> </span><span class="typ">System</span><span class="pun">.</span><span class="typ">Text</span><span class="pun">;</span><span class="pln"> 
    </span><span class="kwd">using</span><span class="pln"> </span><span class="typ">Microsoft</span><span class="pun">.</span><span class="typ">EntityFrameworkCore</span><span class="pun">;</span><span class="pln"> 
    </span><span class="kwd">using</span><span class="pln"> </span><span class="typ">Microsoft</span><span class="pun">.</span><span class="typ">EntityFrameworkCore</span><span class="pun">.</span><span class="typ">Design</span><span class="pun">;</span><span class="pln"> 

    </span><span class="kwd">namespace</span><span class="pln"> </span><span class="typ">EFCoreTutorial</span><span class="pln">
    </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">DefaultDbContext</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="typ">DbContext</span><span class="pln">
        </span><span class="pun">{</span><span class="pln">
            </span><span class="com">// Connection string, more details below </span><span class="pln">
            </span><span class="kwd">private</span><span class="pln"> </span><span class="kwd">const</span><span class="pln"> string connectionString </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Server=localhost;Database=efcoretutorial;Uid=root;Pwd="</span><span class="pun">;</span><span class="pln">

            </span><span class="com">// Initialize a new MySQL connection with the given connection parameters </span><span class="pln">
            </span><span class="kwd">protected</span><span class="pln"> override </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">OnConfiguring</span><span class="pun">(</span><span class="typ">DbContextOptionsBuilder</span><span class="pln"> optionsBuilder</span><span class="pun">)</span><span class="pln">
            </span><span class="pun">{</span><span class="pln">
                optionsBuilder</span><span class="pun">.</span><span class="typ">UseMySql</span><span class="pun">(</span><span class="pln">connectionString</span><span class="pun">);</span><span class="pln">
            </span><span class="pun">}</span><span class="pln">

            </span><span class="com">// Account model class created somewhere else </span><span class="pln">
            </span><span class="kwd">public</span><span class="pln"> </span><span class="typ">DbSet</span><span class="pun">&lt;</span><span class="typ">Account</span><span class="pun">&gt;</span><span class="pln"> </span><span class="typ">Accounts</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> get</span><span class="pun">;</span><span class="pln"> </span><span class="typ">set</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
        </span><span class="pun">}</span><span class="pln">
    </span><span class="pun">}</span></pre>

<p>
	 
</p>

<p>
	<strong><span style="color:#e67e22;">Server = </span></strong><span>the address of the server, in this case localhost</span><br /><strong><span style="color:#e67e22;">Database = </span></strong><span>name of the database</span><br /><strong><span style="color:#e67e22;">Uid = </span></strong><span>user accessing the database</span><br /><strong><span style="color:#e67e22;">Pwd = </span></strong><span>database password, leave empty if none</span>
</p>

<p>
	 
</p>

<p>
	<strong><span style="color:#2980b9;">3.</span> Create a model class, in this case it's called Account</strong>
</p>

<p>
	 
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted">
<span class="pln">	    
</span><span class="kwd">using</span><span class="pln"> </span><span>System</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">using</span><span class="pln"> </span><span>System</span><span class="pun">.</span><span>Collections</span><span class="pun">.</span><span>Generic</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">using</span><span class="pln"> </span><span>System</span><span class="pun">.</span><span>ComponentModel</span><span class="pun">.</span><span>DataAnnotations</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">using</span><span class="pln"> </span><span>System</span><span class="pun">.</span><span>ComponentModel</span><span class="pun">.</span><span>DataAnnotations</span><span class="pun">.</span><span>Schema</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">using</span><span class="pln"> </span><span>System</span><span class="pun">.</span><span>Text</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">namespace</span><span class="pln"> </span><span>EFCoreTutorial</span><span class="pln">
</span><span class="pun">{</span><span class="pln">    
    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span>Account</span><span class="pln">
    </span><span class="pun">{</span><span class="pln">
        </span><span class="pun">[</span><span>Key</span><span class="pun">]</span><span class="pln">
        </span><span class="kwd">public</span><span class="pln"> </span><span>int</span><span class="pln"> </span><span>Id</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> get</span><span class="pun">;</span><span class="pln"> </span><span>set</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">

        </span><span class="kwd">public</span><span class="pln"> string </span><span>Username</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> get</span><span class="pun">;</span><span class="pln"> </span><span>set</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
        </span><span class="kwd">public</span><span class="pln"> string </span><span>Password</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> get</span><span class="pun">;</span><span class="pln"> </span><span>set</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	<strong><span style="color:#2980b9;">4.</span> Let's make a simple registration command.</strong>
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted">
<span class="kwd">using</span><span class="pln"> </span><span class="typ">System</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">using</span><span class="pln"> </span><span class="typ">System</span><span class="pun">.</span><span class="typ">Collections</span><span class="pun">.</span><span class="typ">Generic</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">using</span><span class="pln"> </span><span class="typ">System</span><span class="pun">.</span><span class="typ">Linq</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">using</span><span class="pln"> </span><span class="typ">System</span><span class="pun">.</span><span class="typ">Text</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">using</span><span class="pln"> </span><span class="typ">GTANetworkAPI</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">namespace</span><span class="pln"> </span><span class="typ">EFCoreTutorial</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Commands</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="typ">Script</span><span class="pln">
    </span><span class="pun">{</span><span class="pln">
        </span><span class="pun">[</span><span class="typ">Command</span><span class="pun">(</span><span class="str">"register"</span><span class="pun">)]</span><span class="pln">
        </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">AccountCmdRegister</span><span class="pun">(</span><span class="typ">Client</span><span class="pln"> player</span><span class="pun">,</span><span class="pln"> string username</span><span class="pun">,</span><span class="pln"> string password</span><span class="pun">)</span><span class="pln">
        </span><span class="pun">{</span><span class="pln">

            </span><span class="typ">RegisterAccount</span><span class="pun">(</span><span class="pln">player</span><span class="pun">,</span><span class="pln"> username</span><span class="pun">,</span><span class="pln"> password</span><span class="pun">);</span><span class="pln">
            NAPI</span><span class="pun">.</span><span class="typ">Chat</span><span class="pun">.</span><span class="typ">SendChatMessageToPlayer</span><span class="pun">(</span><span class="pln">player</span><span class="pun">,</span><span class="pln"> </span><span class="str">"~g~Registration successful!"</span><span class="pun">);</span><span class="pln">

        </span><span class="pun">}</span><span class="pln">

        </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">RegisterAccount</span><span class="pun">(</span><span class="typ">Client</span><span class="pln"> client</span><span class="pun">,</span><span class="pln"> string username</span><span class="pun">,</span><span class="pln"> string password</span><span class="pun">)</span><span class="pln">
        </span><span class="pun">{</span><span class="pln">
            
            </span><span class="com">// create a new Account object</span><span class="pln">
            var account </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Account</span><span class="pln">
            </span><span class="pun">{</span><span class="pln">
                </span><span class="typ">Username</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> username</span><span class="pun">,</span><span class="pln">
                </span><span class="typ">Password</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> password
            </span><span class="pun">};</span><span class="pln">
            
            </span><span class="com">// When created like this, the context will be immediately deleted AKA disposed. </span><span class="pln">
            </span><span class="com">// This will make sure you don't have slowdowns with database calls if one day your server becomes popular</span><span class="pln">
            </span><span class="kwd">using</span><span class="pln"> </span><span class="pun">(</span><span class="pln">var dbContext </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">DefaultDbContext</span><span class="pun">())</span><span class="pln">
            </span><span class="pun">{</span><span class="pln">
              	</span><span class="com">// Add this account data to the current context</span><span class="pln">
                dbContext</span><span class="pun">.</span><span class="typ">Accounts</span><span class="pun">.</span><span class="typ">Add</span><span class="pun">(</span><span class="pln">account</span><span class="pun">);</span><span class="pln">
                </span><span class="com">// And finally insert the data into the database</span><span class="pln">
                dbContext</span><span class="pun">.</span><span class="typ">SaveChanges</span><span class="pun">();</span><span class="pln">
            </span><span class="pun">}</span><span class="pln">
            
        </span><span class="pun">}</span><span class="pln">
        
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	 
</p>

<p>
	<strong><span style="color:#2980b9;">4a.</span> To check if you are properly connected to the database without going into the game, make a query when a resource starts, for example:</strong>
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted">
<span class="kwd">using</span><span class="pln"> </span><span class="typ">System</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">using</span><span class="pln"> </span><span class="typ">System</span><span class="pun">.</span><span class="typ">Collections</span><span class="pun">.</span><span class="typ">Generic</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">using</span><span class="pln"> </span><span class="typ">System</span><span class="pun">.</span><span class="typ">Linq</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">using</span><span class="pln"> </span><span class="typ">System</span><span class="pun">.</span><span class="typ">Text</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">using</span><span class="pln"> </span><span class="typ">GTANetworkAPI</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">namespace</span><span class="pln"> </span><span class="typ">EFCoreTutorial</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Main</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="typ">Script</span><span class="pln">
    </span><span class="pun">{</span><span class="pln">
        </span><span class="pun">[</span><span class="typ">ServerEvent</span><span class="pun">(</span><span class="typ">Event</span><span class="pun">.</span><span class="typ">ResourceStart</span><span class="pun">)]</span><span class="pln">
        </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">OnResourceStart</span><span class="pun">()</span><span class="pln">
        </span><span class="pun">{</span><span class="pln">
            </span><span class="kwd">using</span><span class="pln"> </span><span class="pun">(</span><span class="pln">var dbContext </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">DefaultDbContext</span><span class="pun">())</span><span class="pln">
            </span><span class="pun">{</span><span class="pln">
                var playerCount </span><span class="pun">=</span><span class="pln"> dbContext</span><span class="pun">.</span><span class="typ">Accounts</span><span class="pun">.</span><span class="typ">Count</span><span class="pun">();</span><span class="pln">
                NAPI</span><span class="pun">.</span><span class="typ">Util</span><span class="pun">.</span><span class="typ">ConsoleOutput</span><span class="pun">(</span><span class="str">"Total players in the database: "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> playerCount</span><span class="pun">);</span><span class="pln">
            </span><span class="pun">}</span><span class="pln">
        </span><span class="pun">}</span><span class="pln">
        
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	 
</p>

<p>
	<strong><span style="color:#2980b9;">5.</span> Before we can test the command or the above example, we need to make a migration. Manual migrations are the only way as of EF Core. To use them in our gamemodes which are most often only libraries (.dlls), we need to "trick the system" into thinking our gamemode is executable. The easiest way is to "create" a console application. </strong>
</p>

<p>
	<br />
	First, open your project properties, ALT + F7.
</p>

<p>
	Change output type to "Console Application"
</p>

<p>
	<img alt="JvXE5oy.png" class="ipsImage" height="177" width="638" src="https://i.imgur.com/JvXE5oy.png" /></p>

<p>
	 
</p>

<p>
	Save with CTRL + S!
</p>

<p>
	 
</p>

<p>
	Create a new class called Program.cs with the code below:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted">
<span class="kwd">using</span><span class="pln"> </span><span>System</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">using</span><span class="pln"> </span><span>System</span><span class="pun">.</span><span>Collections</span><span class="pun">.</span><span>Generic</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">using</span><span class="pln"> </span><span>System</span><span class="pun">.</span><span>Text</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">namespace</span><span class="pln"> </span><span>EFCoreTutorial</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span>Program</span><span class="pln">
    </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span>Main</span><span class="pun">(</span><span class="pln">string</span><span class="pun">[]</span><span class="pln"> args</span><span class="pun">)</span><span class="pln">
        </span><span class="pun">{</span><span class="pln">
            
        </span><span class="pun">}</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	<br />
	Yes, that's right. You only need the Main method. It's because the console app approach looks for "Main" as a starting point.
</p>

<p>
	Save and build the project!
</p>

<p>
	 
</p>

<p>
	Now let's make the first migration. Open up the Package Manager Console and type "add-migration FirstMigration" (FirstMigration is only the name). After the migration class has been created, type once again into the console "update-database". The very first migration is now added and inside your database you will find Accounts table:
</p>

<p>
	<img alt="r7rXxZh.png" class="ipsImage" height="138" width="1200" src="https://i.imgur.com/r7rXxZh.png" /></p>

<p>
	 
</p>

<p>
	Note: If there are any errors by this stage, then you are most likely not connected to your Database. This guide will not cover that!
</p>

<p>
	 
</p>

<p>
	<strong><span style="color:#2980b9;">6.</span> We are almost done. For server to properly work, it will need runtime dlls.</strong>
</p>

<p>
	When you first start RAGEMP client, you will download some runtime files. Those are not enough and you have to take some extra steps.<br />
	Go to the "RAGEMP" root folder, then "dotnet" folder and copy everything. Paste it inside the "runtime" folder (RAGEMP\server-files\bridge\runtime). <br /><br />
	When you build your project, it will also give you runtime files. Copy everything from bin/debug/netcoreapp2.2 (default build path) <strong>except </strong>Bootstrapper.dll , Newtonsoft.Json.dll and everything that starts with YourProjectName (EFCoreTutorial in my case).
</p>

<p>
	<img alt="YLwjQ4l.png" class="ipsImage" height="801" width="637" src="https://i.imgur.com/YLwjQ4l.png" /></p>

<p>
	Paste it once again inside the "runtime" folder (RAGEMP\server-files\bridge\runtime).
</p>

<p>
	 
</p>

<p>
	Finally, open YourProjectName.csproj with notepad and add this line
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="tag">&lt;CopyLocalLockFileAssemblies&gt;</span><span class="pln">true</span><span class="tag">&lt;/CopyLocalLockFileAssemblies&gt;</span></pre>

<p>
	like so:
</p>

<p>
	<img alt="7phI6ht.png" class="ipsImage" height="95" width="624" src="https://i.imgur.com/7phI6ht.png" /></p>

<p>
	 
</p>

<p>
	Save and close.
</p>

<p>
	 
</p>

<p>
	<strong><span style="color:#2980b9;">7.</span> You are all set up!</strong>
</p>

<p>
	From now on you don't have to worry about missing runtimes, errors and whatnot. This is everything Entity Framework Core requires to work properly in RAGEMP.
</p>

<p>
	 
</p>

<p>
	<strong><u>Changelog:</u></strong>
</p>

<p>
	- <s>Added appsettings.json, a better way of handling connection strings. Thanks</s> <span><span><a contenteditable="false" data-ipshover="" data-ipshover-target="https://rage.mp/profile/36362-horseyhorsey/?do=hovercard" data-mentionid="36362" href="https://rage.mp/profile/36362-horseyhorsey/" rel="">@horseyhorsey</a>!</span></span><br /><span><span>- Some clarification</span></span><br /><span><span>- Cleaned and updated the code per <a contenteditable="false" data-ipshover="" data-ipshover-target="https://rage.mp/profile/11612-adam/?do=hovercard" data-mentionid="11612" href="https://rage.mp/profile/11612-adam/" rel="">@Adam</a>'s suggestion</span></span>
</p>

<p>
	 
</p>

<p>
	 
</p>

<p style="text-align:center;">
	<span style="font-size:24px;"><strong>This was my first tutorial/guide.<br />
	Leave feedback and opinions.</strong></span>
</p>

<p style="text-align:center;">
	<span style="font-size:24px;"><strong>Thank you for reading!</strong></span>
</p>

<p>
	 
</p>

<p>
	<em><strong>xForcer</strong></em>
</p>]]></description><guid isPermaLink="false">3099</guid><pubDate>Sun, 30 Dec 2018 01:20:31 +0000</pubDate></item><item><title>[TUTORIAL] Sending Server logs to Discords</title><link>https://rage.mp/forums/topic/6430-tutorial-sending-server-logs-to-discords/</link><description><![CDATA[<p>
	<span style="font-size:16px;"><b>it's always useful to keep an eye on the activity of the server like players joining/leaving the server while you're chatting on discord. This can be achieved by using our lovely Webhook friends. This tutorial aims to give you knowledge about how to use those web-hooks to keep in contact with some server logs.</b></span>
</p>

<p>
	<u><b><span style="font-size:20px;">Creating a Webhook</span></b></u>
</p>

<p>
	<b><span style="font-size:16px;">It's really easy, create a channel go to channel settings -&gt; webhooks -&gt; Create a webhook</span></b>
</p>

<p>
	<b><span style="font-size:16px;">I'll call mine Spicy.</span></b>
</p>

<p>
	 
</p>

<p>
	<img alt="8cS_QRQkS-ec16p2b5Ng-A.png" class="ipsImage" data-ratio="129.12" height="634" width="491" src="https://image.prntscr.com/image/8cS_QRQkS-ec16p2b5Ng-A.png" /></p>

<p>
	<span style="font-size:18px;"><strong>Copy the webhook URL and wait for further instructions.</strong></span>
</p>

<p>
	<strong><u><span style="font-size:22px;">Using the Webhook</span></u></strong>
</p>

<p>
	<span style="font-size:18px;"><b>Now we'll create a small server-side function that'll help us use the webhook.</b></span>
</p>

<div class="ipsSpoiler" data-ipsspoiler="">
	<div class="ipsSpoiler_header">
		<span>Spoiler</span>
	</div>

	<div class="ipsSpoiler_contents">
		<pre class="ipsCode prettyprint lang-javascript prettyprinted">

<span class="kwd">const</span><span class="pln"> webhook </span><span class="pun">=</span><span class="pln"> </span><span class="str">'Insert webhook URL'</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> serverLogo </span><span class="pun">=</span><span class="pln"> </span><span class="str">'Shiny logo URL'</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> got </span><span class="pun">=</span><span class="pln"> require</span><span class="pun">(</span><span class="str">'got'</span><span class="pun">);</span><span class="pln"> </span><span class="com">// Fast beast request package</span><span class="pln">

mp</span><span class="pun">.</span><span class="pln">discord </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{};</span><span class="pln"> </span><span class="com">// Global discord object bound to mp</span><span class="pln">
mp</span><span class="pun">.</span><span class="pln">discord</span><span class="pun">.</span><span class="pln">colors </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="com">// Nice colors to change the embed's color</span><span class="pln">
    RED</span><span class="pun">:</span><span class="pln"> </span><span class="lit">13632027</span><span class="pun">,</span><span class="pln">
    GREEN</span><span class="pun">:</span><span class="pln"> </span><span class="lit">4289797</span><span class="pun">,</span><span class="pln">
    BLUE</span><span class="pun">:</span><span class="pln"> </span><span class="lit">4886754</span><span class="pun">,</span><span class="pln">
    ORANGE</span><span class="pun">:</span><span class="pln"> </span><span class="lit">16098851</span><span class="pun">,</span><span class="pln">
    BLACK</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln">
    WHITE</span><span class="pun">:</span><span class="pln"> </span><span class="lit">16777215</span><span class="pun">,</span><span class="pln">
    GREY</span><span class="pun">:</span><span class="pln"> </span><span class="lit">10197915</span><span class="pun">,</span><span class="pln">
    YELLOW</span><span class="pun">:</span><span class="pln"> </span><span class="lit">16312092</span><span class="pun">,</span><span class="pln">
    BROWN</span><span class="pun">:</span><span class="pln"> </span><span class="lit">9131818</span><span class="pun">,</span><span class="pln">
    CYAN</span><span class="pun">:</span><span class="pln"> </span><span class="lit">5301186</span><span class="pln">
</span><span class="pun">};</span><span class="pln">
</span><span class="com">/*
* @function Our nice function send some logs
* @params:
* title: string (Title of the embed)
* msg: string (description of the log)
* fields: array of objects optional {name: string, value: string, inline: boolean}
* color: int optional (Default: GREY color) use mp.discord.colors.color for more colors
*/</span><span class="pln">
mp</span><span class="pun">.</span><span class="pln">discord</span><span class="pun">.</span><span class="pln">sendMessage </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="pln">title</span><span class="pun">,</span><span class="pln"> msg</span><span class="pun">,</span><span class="pln"> fields </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[],</span><span class="pln"> color </span><span class="pun">=</span><span class="pln"> mp</span><span class="pun">.</span><span class="pln">discord</span><span class="pun">.</span><span class="pln">colors</span><span class="pun">.</span><span class="pln">GREY</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">const</span><span class="pln"> embed </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="str">"embeds"</span><span class="pun">:</span><span class="pln"> </span><span class="pun">[{</span><span class="pln">
            </span><span class="str">"author"</span><span class="pun">:</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
                </span><span class="str">"name"</span><span class="pun">:</span><span class="pln"> mp</span><span class="pun">.</span><span class="pln">config</span><span class="pun">.</span><span class="pln">name</span><span class="pun">,</span><span class="pln"> </span><span class="com">// Server's name</span><span class="pln">
                </span><span class="str">"icon_url"</span><span class="pun">:</span><span class="pln"> serverLogo </span><span class="com">// Server's logo</span><span class="pln">
            </span><span class="pun">},</span><span class="pln">
            </span><span class="str">"title"</span><span class="pun">:</span><span class="pln"> title</span><span class="pun">,</span><span class="pln">
            </span><span class="str">"description"</span><span class="pun">:</span><span class="pln"> msg</span><span class="pun">,</span><span class="pln">
            </span><span class="str">"thumbnail"</span><span class="pun">:</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
                </span><span class="str">"url"</span><span class="pun">:</span><span class="pln"> serverLogo
            </span><span class="pun">},</span><span class="pln">
            </span><span class="str">"fields"</span><span class="pun">:</span><span class="pln"> fields</span><span class="pun">,</span><span class="pln">
            </span><span class="str">"color"</span><span class="pun">:</span><span class="pln"> color
        </span><span class="pun">}]</span><span class="pln">
    </span><span class="pun">};</span><span class="pln">
    got</span><span class="pun">.</span><span class="pln">post</span><span class="pun">(</span><span class="pln">webhook</span><span class="pun">,</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="com">// Method to post the log into discord webhook</span><span class="pln">
        body</span><span class="pun">:</span><span class="pln"> JSON</span><span class="pun">.</span><span class="pln">stringify</span><span class="pun">(</span><span class="pln">embed</span><span class="pun">),</span><span class="pln">
        headers</span><span class="pun">:</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
            </span><span class="str">'content-type'</span><span class="pun">:</span><span class="pln"> </span><span class="str">"application/json"</span><span class="pln">
        </span><span class="pun">}</span><span class="pln">
    </span><span class="pun">})</span><span class="pln">
</span><span class="pun">};</span></pre>

		<p>
			PS: Don't forget to do <em><strong>npm install got --save  </strong></em>before using this package.
		</p>
	</div>
</div>

<p>
	<span style="font-size:18px;"><strong>Now here's a small example of how to use it:</strong></span><br />
	 
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted">
<span class="com">// Triggers once player joins the server...</span><span class="pln">

mp</span><span class="pun">.</span><span class="pln">events</span><span class="pun">.</span><span class="pln">add</span><span class="pun">(</span><span class="str">'playerJoin'</span><span class="pun">,</span><span class="pln"> </span><span class="pun">(</span><span class="pln">player</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
	mp</span><span class="pun">.</span><span class="pln">discord</span><span class="pun">.</span><span class="pln">sendMessage</span><span class="pun">(`</span><span class="typ">Player</span><span class="pln"> joined the server </span><span class="pun">[</span><span class="pln">$</span><span class="pun">{</span><span class="pln">mp</span><span class="pun">.</span><span class="pln">players</span><span class="pun">.</span><span class="pln">toArray</span><span class="pun">().</span><span class="pln">length</span><span class="pun">}/</span><span class="pln">$</span><span class="pun">{</span><span class="pln">mp</span><span class="pun">.</span><span class="pln">config</span><span class="pun">.</span><span class="pln">maxplayers</span><span class="pun">}]`,</span><span class="pln"> player</span><span class="pun">.</span><span class="pln">name</span><span class="pun">,</span><span class="pln"> </span><span class="pun">[],</span><span class="pln"> mp</span><span class="pun">.</span><span class="pln">discord</span><span class="pun">.</span><span class="pln">colors</span><span class="pun">.</span><span class="pln">GREEN</span><span class="pun">);</span><span class="pln">
</span><span class="pun">});</span><span class="pln">

</span><span class="com">// Another one with fields</span><span class="pln">

mp</span><span class="pun">.</span><span class="pln">events</span><span class="pun">.</span><span class="pln">add</span><span class="pun">(</span><span class="str">'playerJoin'</span><span class="pun">,</span><span class="pln"> </span><span class="pun">(</span><span class="pln">player</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">let</span><span class="pln"> fields </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[{</span><span class="pln">
    name</span><span class="pun">:</span><span class="pln"> </span><span class="pun">`</span><span class="typ">Player</span><span class="str">'</span><span class="pln">s IP</span><span class="pun">`,</span><span class="pln">
    value</span><span class="pun">:</span><span class="pln"> player</span><span class="pun">.</span><span class="pln">ip</span><span class="pun">,</span><span class="pln">
    </span><span class="kwd">inline</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">false</span><span class="pln">
  </span><span class="pun">}]</span><span class="pln">
  mp</span><span class="pun">.</span><span class="pln">discord</span><span class="pun">.</span><span class="pln">sendMessage</span><span class="pun">(`</span><span class="typ">Player</span><span class="pln"> joined the server </span><span class="pun">[</span><span class="pln">$</span><span class="pun">{</span><span class="pln">mp</span><span class="pun">.</span><span class="pln">players</span><span class="pun">.</span><span class="pln">toArray</span><span class="pun">().</span><span class="pln">length</span><span class="pun">}/</span><span class="pln">$</span><span class="pun">{</span><span class="pln">mp</span><span class="pun">.</span><span class="pln">config</span><span class="pun">.</span><span class="pln">maxplayers</span><span class="pun">}]`,</span><span class="pln"> player</span><span class="pun">.</span><span class="pln">name</span><span class="pun">,</span><span class="pln"> fields</span><span class="pun">,</span><span class="pln"> mp</span><span class="pun">.</span><span class="pln">discord</span><span class="pun">.</span><span class="pln">colors</span><span class="pun">.</span><span class="pln">GREEN</span><span class="pun">);</span><span class="pln">
</span><span class="pun">});</span></pre>

<p>
	<img alt="BTKl7cDJSAqp0hVwBy7J5g.png" class="ipsImage" data-ratio="35.37" height="168" width="475" src="https://image.prntscr.com/image/BTKl7cDJSAqp0hVwBy7J5g.png" /></p>

<p>
	<img alt="upmBrpilRK637rtjZpXyMA.png" class="ipsImage" data-ratio="40.51" height="158" width="390" src="https://image.prntscr.com/image/upmBrpilRK637rtjZpXyMA.png" /></p>

<p>
	 
</p>

<p>
	<span style="font-size:18px;"><strong>Now you have your own discord logger, use it wisely. Enjoy spamming discord....</strong></span>
</p>

<p>
	 
</p>

<p>
	<span style="font-size:18px;"><strong>Regards,</strong></span><br /><span style="font-size:18px;"><strong>Keptin</strong></span>
</p>]]></description><guid isPermaLink="false">6430</guid><pubDate>Tue, 08 Oct 2019 17:18:27 +0000</pubDate></item><item><title>how to send variable from server to client?</title><link>https://rage.mp/forums/topic/6408-how-to-send-variable-from-server-to-client/</link><description><![CDATA[<p>
	somebody know how to send variable from server events to client?
</p>]]></description><guid isPermaLink="false">6408</guid><pubDate>Sat, 05 Oct 2019 08:58:32 +0000</pubDate></item><item><title>Add Command Line to server console</title><link>https://rage.mp/forums/topic/213-add-command-line-to-server-console/</link><description><![CDATA[
<p>
	Create file 'commandline.js' to dir 'packages/keker' with the following code:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted">
<span class="kwd">const</span><span class="pln"> readline </span><span class="pun">=</span><span class="pln"> require</span><span class="pun">(</span><span class="str">'readline'</span><span class="pun">);</span><span class="pln">

</span><span class="kwd">const</span><span class="pln"> rl </span><span class="pun">=</span><span class="pln"> readline</span><span class="pun">.</span><span class="pln">createInterface</span><span class="pun">({</span><span class="pln">
  input</span><span class="pun">:</span><span class="pln"> process</span><span class="pun">.</span><span class="pln">stdin</span><span class="pun">,</span><span class="pln">
  output</span><span class="pun">:</span><span class="pln"> process</span><span class="pun">.</span><span class="pln">stdout
</span><span class="pun">});</span><span class="pln">

</span><span class="kwd">function</span><span class="pln"> </span><span>ParseCmd</span><span class="pun">(</span><span class="pln">s</span><span class="pun">){</span><span class="pln">
	</span><span class="kwd">var</span><span class="pln"> args </span><span class="pun">=</span><span class="pln"> s</span><span class="pun">.</span><span class="pln">split</span><span class="pun">(</span><span class="str">" "</span><span class="pun">);</span><span class="pln">
	</span><span class="kwd">var</span><span class="pln"> cmd </span><span class="pun">=</span><span class="pln"> args</span><span class="pun">[</span><span class="lit">0</span><span class="pun">].</span><span class="pln">toLowerCase</span><span class="pun">();</span><span class="pln">
	</span><span class="kwd">var</span><span class="pln"> res </span><span class="pun">=</span><span class="pln"> </span><span class="str">''</span><span class="pun">;</span><span class="pln">
	</span><span class="kwd">switch</span><span class="pun">(</span><span class="pln">cmd</span><span class="pun">){</span><span class="pln">
		</span><span class="kwd">case</span><span class="pln"> </span><span class="str">"ban"</span><span class="pun">:</span><span class="pln">
			mp</span><span class="pun">.</span><span class="pln">players</span><span class="pun">.</span><span class="pln">forEach</span><span class="pun">(</span><span class="pln">player </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> 
				</span><span class="kwd">if</span><span class="pun">(</span><span class="pln">player</span><span class="pun">.</span><span class="pln">name</span><span class="pun">.</span><span class="pln">toLowerCase</span><span class="pun">()</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> args</span><span class="pun">[</span><span class="lit">1</span><span class="pun">].</span><span class="pln">toLowerCase</span><span class="pun">()){</span><span class="pln">
					player</span><span class="pun">.</span><span class="pln">ban</span><span class="pun">(</span><span class="str">"Console"</span><span class="pun">);</span><span class="pln">
					res </span><span class="pun">=</span><span class="pln"> </span><span class="str">" Player "</span><span class="pun">+</span><span class="pln">player</span><span class="pun">.</span><span class="pln">name</span><span class="pun">+</span><span class="str">" was banned!!!"</span><span class="pun">;</span><span class="pln">
				</span><span class="pun">}</span><span class="pln"> 
				</span><span class="pun">});</span><span class="pln">
			</span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
		</span><span class="kwd">case</span><span class="pln"> </span><span class="str">"kick"</span><span class="pun">:</span><span class="pln">
			mp</span><span class="pun">.</span><span class="pln">players</span><span class="pun">.</span><span class="pln">forEach</span><span class="pun">(</span><span class="pln">player </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> 
				</span><span class="kwd">if</span><span class="pun">(</span><span class="pln">player</span><span class="pun">.</span><span class="pln">name</span><span class="pun">.</span><span class="pln">toLowerCase</span><span class="pun">()</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> args</span><span class="pun">[</span><span class="lit">1</span><span class="pun">].</span><span class="pln">toLowerCase</span><span class="pun">()){</span><span class="pln">
					player</span><span class="pun">.</span><span class="pln">kick</span><span class="pun">(</span><span class="str">"Console"</span><span class="pun">);</span><span class="pln">
					res </span><span class="pun">=</span><span class="pln"> </span><span class="str">" Player "</span><span class="pun">+</span><span class="pln">player</span><span class="pun">.</span><span class="pln">name</span><span class="pun">+</span><span class="str">" was kicked!!!"</span><span class="pun">;</span><span class="pln">
				</span><span class="pun">}</span><span class="pln"> 
				</span><span class="pun">});</span><span class="pln">
			</span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
		</span><span class="kwd">case</span><span class="pln"> </span><span class="str">"tppos"</span><span class="pun">:</span><span class="pln">
			</span><span class="kwd">if</span><span class="pun">(</span><span class="pln">args</span><span class="pun">.</span><span class="pln">length</span><span class="pun">&gt;</span><span class="lit">4</span><span class="pun">){</span><span class="pln">
				mp</span><span class="pun">.</span><span class="pln">players</span><span class="pun">.</span><span class="pln">forEach</span><span class="pun">(</span><span class="pln">player </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> 
				</span><span class="kwd">if</span><span class="pun">(</span><span class="pln">player</span><span class="pun">.</span><span class="pln">name</span><span class="pun">.</span><span class="pln">toLowerCase</span><span class="pun">()</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> args</span><span class="pun">[</span><span class="lit">1</span><span class="pun">].</span><span class="pln">toLowerCase</span><span class="pun">()){</span><span class="pln">
					player</span><span class="pun">.</span><span class="pln">position </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> mp</span><span class="pun">.</span><span>Vector3</span><span class="pun">(</span><span class="pln">parseFloat</span><span class="pun">(</span><span class="pln">args</span><span class="pun">[</span><span class="lit">2</span><span class="pun">]),</span><span class="pln"> parseFloat</span><span class="pun">(</span><span class="pln">args</span><span class="pun">[</span><span class="lit">3</span><span class="pun">]),</span><span class="pln"> parseFloat</span><span class="pun">(</span><span class="pln">args</span><span class="pun">[</span><span class="lit">4</span><span class="pun">]));</span><span class="pln">
					res </span><span class="pun">=</span><span class="pln"> </span><span class="str">" Player "</span><span class="pun">+</span><span class="pln">player</span><span class="pun">.</span><span class="pln">name</span><span class="pun">+</span><span class="str">" was teleported to X:"</span><span class="pun">+</span><span class="pln">parseFloat</span><span class="pun">(</span><span class="pln">args</span><span class="pun">[</span><span class="lit">2</span><span class="pun">])+</span><span class="str">" Y:"</span><span class="pun">+</span><span class="pln">parseFloat</span><span class="pun">(</span><span class="pln">args</span><span class="pun">[</span><span class="lit">3</span><span class="pun">])+</span><span class="str">" Z:"</span><span class="pun">+</span><span class="pln">parseFloat</span><span class="pun">(</span><span class="pln">args</span><span class="pun">[</span><span class="lit">4</span><span class="pun">])+</span><span class="str">"!!!"</span><span class="pun">;</span><span class="pln">
				</span><span class="pun">}</span><span class="pln"> 
				</span><span class="pun">});</span><span class="pln">
			</span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
				res </span><span class="pun">=</span><span class="pln"> </span><span class="str">" Invalid arguments!!!"</span><span class="pln">
			</span><span class="pun">}</span><span class="pln">
			</span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
		</span><span class="kwd">case</span><span class="pln"> </span><span class="str">"give.weapons"</span><span class="pun">:</span><span class="pln">
			</span><span class="kwd">if</span><span class="pun">(</span><span class="pln">args</span><span class="pun">.</span><span class="pln">length</span><span class="pun">&gt;</span><span class="lit">3</span><span class="pun">){</span><span class="pln">
				mp</span><span class="pun">.</span><span class="pln">players</span><span class="pun">.</span><span class="pln">forEach</span><span class="pun">(</span><span class="pln">player </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> 
				</span><span class="kwd">if</span><span class="pun">(</span><span class="pln">player</span><span class="pun">.</span><span class="pln">name</span><span class="pun">.</span><span class="pln">toLowerCase</span><span class="pun">()</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> args</span><span class="pun">[</span><span class="lit">1</span><span class="pun">].</span><span class="pln">toLowerCase</span><span class="pun">()){</span><span class="pln">
					player</span><span class="pun">.</span><span class="pln">giveWeapon</span><span class="pun">(</span><span class="pln">mp</span><span class="pun">.</span><span class="pln">joaat</span><span class="pun">(</span><span class="pln">args</span><span class="pun">[</span><span class="lit">2</span><span class="pun">]),</span><span class="pln"> parseInt</span><span class="pun">(</span><span class="pln">args</span><span class="pun">[</span><span class="lit">3</span><span class="pun">]));</span><span class="pln">
					res </span><span class="pun">=</span><span class="pln"> </span><span class="str">" Player "</span><span class="pun">+</span><span class="pln">player</span><span class="pun">.</span><span class="pln">name</span><span class="pun">+</span><span class="str">" received weapons!!!"</span><span class="pun">;</span><span class="pln">
				</span><span class="pun">}</span><span class="pln"> 
				</span><span class="pun">});</span><span class="pln">
			</span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
				res </span><span class="pun">=</span><span class="pln"> </span><span class="str">" Invalid arguments!!!"</span><span class="pln">
			</span><span class="pun">}</span><span class="pln">
			</span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
		</span><span class="kwd">case</span><span class="pln"> </span><span class="str">"status"</span><span class="pun">:</span><span class="pln">
			res </span><span class="pun">=</span><span class="pln"> </span><span class="str">"\n Players: "</span><span class="pun">+</span><span class="pln">mp</span><span class="pun">.</span><span class="pln">players</span><span class="pun">.</span><span class="pln">length</span><span class="pun">+</span><span class="str">"/"</span><span class="pun">+</span><span class="pln">mp</span><span class="pun">.</span><span class="pln">players</span><span class="pun">.</span><span class="pln">size</span><span class="pun">+</span><span class="str">"\n Vehicles: "</span><span class="pun">+</span><span class="pln">mp</span><span class="pun">.</span><span class="pln">vehicles</span><span class="pun">.</span><span class="pln">length</span><span class="pun">+</span><span class="str">"\n Objects: "</span><span class="pun">+</span><span class="pln">mp</span><span class="pun">.</span><span class="pln">objects</span><span class="pun">.</span><span class="pln">length</span><span class="pun">+</span><span class="str">"\n Wheather: "</span><span class="pun">+</span><span class="pln">mp</span><span class="pun">.</span><span class="pln">environment</span><span class="pun">.</span><span class="pln">weather</span><span class="pun">+</span><span class="str">"\n Game Time: "</span><span class="pun">+</span><span class="pln">mp</span><span class="pun">.</span><span class="pln">environment</span><span class="pun">.</span><span class="pln">time</span><span class="pun">.</span><span class="pln">hour</span><span class="pun">+</span><span class="str">"h\n Uptime: "</span><span class="pun">+</span><span class="pln">process</span><span class="pun">.</span><span class="pln">uptime</span><span class="pun">()+</span><span class="str">"\n"</span><span class="pun">;</span><span class="pln">
			</span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
		</span><span class="kwd">case</span><span class="pln"> </span><span class="str">"online"</span><span class="pun">:</span><span class="pln">
			res </span><span class="pun">=</span><span class="pln"> </span><span class="str">"\n Online: "</span><span class="pun">+</span><span class="pln">mp</span><span class="pun">.</span><span class="pln">players</span><span class="pun">.</span><span class="pln">length</span><span class="pun">+</span><span class="str">"/"</span><span class="pun">+</span><span class="pln">mp</span><span class="pun">.</span><span class="pln">players</span><span class="pun">.</span><span class="pln">size</span><span class="pun">+</span><span class="str">"\n "</span><span class="pun">;</span><span class="pln">
			mp</span><span class="pun">.</span><span class="pln">players</span><span class="pun">.</span><span class="pln">forEach</span><span class="pun">(</span><span class="pln">player </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
				res </span><span class="pun">+=</span><span class="pln"> player</span><span class="pun">.</span><span class="pln">name</span><span class="pun">+</span><span class="str">" | "</span><span class="pun">+</span><span class="pln">player</span><span class="pun">.</span><span class="pln">ip</span><span class="pun">+</span><span class="str">" | "</span><span class="pun">+</span><span class="pln">player</span><span class="pun">.</span><span class="pln">ping</span><span class="pun">+</span><span class="str">"\n "</span><span class="pun">;</span><span class="pln">
			</span><span class="pun">});</span><span class="pln">
			</span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
		</span><span class="kwd">default</span><span class="pun">:</span><span class="pln">
			res </span><span class="pun">=</span><span class="pln"> </span><span class="str">" Unknown command!!!"</span><span class="pun">;</span><span class="pln">
			</span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
	</span><span class="pun">}</span><span class="pln">
	</span><span class="kwd">return</span><span class="pln"> res</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

rl</span><span class="pun">.</span><span class="pln">on</span><span class="pun">(</span><span class="str">'line'</span><span class="pun">,</span><span class="pln"> </span><span class="pun">(</span><span class="pln">s</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
	</span><span class="kwd">var</span><span class="pln"> res </span><span class="pun">=</span><span class="pln"> </span><span>ParseCmd</span><span class="pun">(</span><span class="pln">s</span><span class="pun">);</span><span class="pln">
	console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">res</span><span class="pun">);</span><span class="pln">
</span><span class="pun">});</span></pre>

<p>
	After that,  append to file 'packages/keker/index.js' the following line:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted">
<span class="pln">require</span><span class="pun">(</span><span class="str">"./commandline"</span><span class="pun">);</span></pre>

<p>
	Then you can execute commands on the server console.
</p>

<p>
	The list of available commands as seen from the code:
</p>

<pre class="ipsCode">
ban &lt;PlayerName&gt; -&gt; Kiked player
kick &lt;PlayerName&gt; -&gt; Baned player
tppos &lt;PlayerName&gt; &lt;X&gt; &lt;Y&gt; &lt;Z&gt; -&gt; Teleport player to coordinates
give.weapons &lt;PlayerName&gt; &lt;WeaponName&gt; &lt;Amount&gt; -&gt; Give weapon to player
status -&gt; Show server info
online -&gt; Show players list with info(Name,IP,Ping)</pre>

<p>
	 
</p>
]]></description><guid isPermaLink="false">213</guid><pubDate>Wed, 11 Jan 2017 15:16:06 +0000</pubDate></item><item><title>Solution for waypoint</title><link>https://rage.mp/forums/topic/3875-solution-for-waypoint/</link><description><![CDATA[
<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="pln">let waypoint;

mp.events.add('render', () =&gt; {
  // Waypoint
  if (waypoint !== mp.game.invoke('0x1DD1F58F493F1DA5')) {
    waypoint = mp.game.invoke('0x1DD1F58F493F1DA5');
    let blipIterator = mp.game.invoke('0x186E5D252FA50E7D');
    let FirstInfoId = mp.game.invoke('0x1BEDE233E6CD2A1F', blipIterator);
    let NextInfoId = mp.game.invoke('0x14F96AA50D6FBEA7', blipIterator);
    for (let i = FirstInfoId; mp.game.invoke('0xA6DB27D19ECBB7DA', i) != 0; i = NextInfoId) {
      if (mp.game.invoke('0xBE9B0959FFD0779B', i) == 4 ) {
        var coord = mp.game.ui.getBlipInfoIdCoord(i);
        mp.events.call("playerCreateWaypoint", coord, Boolean(waypoint));
        mp.events.callRemote("playerCreateWaypoint", JSON.stringify(coord), Boolean(waypoint));
      };
    };
  };
});</span></pre>

<p>
	Client-side
</p>

<div style="background-color:#1e1e1e;color:#d4d4d4;font-size:14px;">
	<div>
		<span style="color:#9cdcfe;">mp</span><span style="color:#d4d4d4;">.</span><span style="color:#9cdcfe;">events</span><span style="color:#d4d4d4;">.</span><span style="color:#dcdcaa;">add</span><span style="color:#d4d4d4;">(</span><span style="color:#ce9178;">'playerCreateWaypoint'</span><span style="color:#d4d4d4;">, (</span><span style="color:#9cdcfe;">position</span><span style="color:#d4d4d4;">, </span><span style="color:#9cdcfe;">toogle</span><span style="color:#d4d4d4;">) </span><span style="color:#569cd6;">=&gt;</span><span style="color:#d4d4d4;"> {</span>
	</div>

	<div>
		<span style="color:#4ec9b0;">    console</span><span style="color:#d4d4d4;">.</span><span style="color:#dcdcaa;">log</span><span style="color:#d4d4d4;">(</span><span style="color:#9cdcfe;">position</span><span style="color:#d4d4d4;">, </span><span style="color:#9cdcfe;">toogle</span><span style="color:#d4d4d4;">);</span>
	</div>

	<div>
		<span style="color:#d4d4d4;">});</span>
	</div>
</div>

<p>
	Server-side
</p>

<div style="background-color:#1e1e1e;color:#d4d4d4;font-size:14px;">
	<div>
		<span style="color:#9cdcfe;">mp</span><span style="color:#d4d4d4;">.</span><span style="color:#9cdcfe;">events</span><span style="color:#d4d4d4;">.</span><span style="color:#dcdcaa;">add</span><span style="color:#d4d4d4;">(</span><span style="color:#ce9178;">'playerCreateWaypoint'</span><span style="color:#d4d4d4;">, (</span><span style="color:#9cdcfe;">player</span><span style="color:#d4d4d4;">, </span><span style="color:#9cdcfe;">position</span><span style="color:#d4d4d4;">, </span><span style="color:#9cdcfe;">toogle</span><span style="color:#d4d4d4;">) </span><span style="color:#569cd6;">=&gt;</span><span style="color:#d4d4d4;"> {</span>
	</div>

	<div>
		<span style="color:#4ec9b0;">    console</span><span style="color:#d4d4d4;">.</span><span style="color:#dcdcaa;">log</span><span style="color:#d4d4d4;">(</span><span style="color:#9cdcfe;">position</span><span style="color:#d4d4d4;">, </span><span style="color:#9cdcfe;">toogle</span><span style="color:#d4d4d4;">);</span>
	</div>

	<div>
		<span style="color:#d4d4d4;">});</span>
	</div>
</div>
]]></description><guid isPermaLink="false">3875</guid><pubDate>Sun, 31 Mar 2019 23:58:01 +0000</pubDate></item><item><title>[OUTDATED] Attaching Chrome console.</title><link>https://rage.mp/forums/topic/1053-outdated-attaching-chrome-console/</link><description><![CDATA[<p>
	Hello Guys,
</p>

<p>
	Today i'll be  teaching you how to attach chrome console debugger to your server.
</p>

<p>
	Please follow these simple steps:
</p>

<p>
	1) Install <a href="https://chrome.google.com/webstore/detail/nodejs-v8-inspector-manag/gnhhdgbaldcilmgcpfddgdbkhjohddkj/related" rel="external nofollow">Nodejs v8 inspector</a> in to chrome.
</p>

<p>
	2) Create a shortcut for your server.exe
</p>

<p>
	 
</p>

<p>
	<img alt="rzsz6yt.png" class="ipsImage" height="639" width="1200" src="https://i.imgur.com/rzsz6yt.png" /></p>

<p>
	 
</p>

<p>
	3) Pass --inspect to the path of the server.exe shortcut.
</p>

<p>
	<img alt="RYu8end.png" class="ipsImage" height="534" width="386" src="https://i.imgur.com/RYu8end.png" /></p>

<p>
	4) Press OK then start your server.exe (shortcut one).
</p>

<p>
	Now you should see this<br /><img alt="RUcjtYP.png" class="ipsImage" height="343" width="677" src="https://i.imgur.com/RUcjtYP.png" /></p>

<p>
	and now Chrome should open with a console like this:
</p>

<p>
	<img alt="fNuYOr9.png" class="ipsImage" height="639" width="1200" src="https://i.imgur.com/fNuYOr9.png" /></p>

<p>
	Now you are good to go. Thank you for watching the Tutorial.
</p>

<p>
	Best Regards,
</p>

<p>
	Captien. (Sea keeper)
</p>]]></description><guid isPermaLink="false">1053</guid><pubDate>Fri, 22 Dec 2017 17:37:58 +0000</pubDate></item><item><title>rage-tools - js framework</title><link>https://rage.mp/forums/topic/5932-rage-tools-js-framework/</link><description><![CDATA[<p>
	<a href="https://www.npmjs.com/package/@ragemp-tools/online" rel="external nofollow">Install: npm</a>
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="pln">npm i @ragemp-tools/online@beta</span></pre>

<pre class="ipsCode prettyprint lang-javascript prettyprinted">
<span class="kwd">const</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> peak</span><span class="pun">,</span><span class="pln"> online</span><span class="pun">,</span><span class="pln"> servers </span><span class="pun">}</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> require</span><span class="pun">(</span><span class="str">'@ragemp-tools/online'</span><span class="pun">)</span><span class="pln">

peak</span><span class="pun">().</span><span class="pln">then</span><span class="pun">(</span><span class="pln">console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">)</span><span class="pln"> </span><span class="com">// output: peak online</span><span class="pln">
online</span><span class="pun">().</span><span class="pln">then</span><span class="pun">(</span><span class="pln">console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">)</span><span class="pln"> </span><span class="com">// output: online now</span><span class="pln">
servers</span><span class="pun">().</span><span class="pln">then</span><span class="pun">(</span><span class="pln">console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">)</span><span class="pln"> </span><span class="com">// output: servers</span></pre>

<pre class="ipsCode prettyprint lang-javascript prettyprinted">
<span class="com">// Definition;</span><span class="pln">

</span><span class="kwd">async</span><span class="pln"> </span><span class="typ">Function</span><span class="pun">():</span><span class="pln"> </span><span class="typ">Promise</span><span class="pun">&lt;</span><span class="pln">any</span><span class="pun">&gt;</span></pre>

<p>
	 
</p>]]></description><guid isPermaLink="false">5932</guid><pubDate>Sat, 10 Aug 2019 14:29:08 +0000</pubDate></item><item><title>[TUTORIAL] How to add .ymaps into your server (client-sided stable mapping!)</title><link>https://rage.mp/forums/topic/3261-tutorial-how-to-add-ymaps-into-your-server-client-sided-stable-mapping/</link><description><![CDATA[
<p>
	With a lot of people with very potential projects presented a lot of quality mapping, I'm a bit late to introducing this but in this tutorial, I'll basically be showing off how to get your mapping into your server through means of it being client-sided. (Which I'd consider as far as displaying mapping goes instead of getting them through .jsons ala server-sided.)
</p>

<p>
	 
</p>

<p>
	<u><strong>What you'll need.</strong></u>
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		Quote
	</div>

	<div class="ipsQuote_contents">
		<p>
			 
		</p>

		<p>
			- A mapping dlcpack base<br />
			(I made one for this tutorial)<br /><a href="https://www.mediafire.com/file/vyv2ajx7ka9stv0/RageMP+mapping+dlcpack+base.zip" rel="external nofollow">https://www.mediafire.com/file/vyv2ajx7ka9stv0/RageMP+mapping+dlcpack+base.zip</a>
		</p>

		<p>
			- Your mapping<br />
			(We'll use this example)<br /><a href="https://www.gta5-mods.com/maps/rockford-hills-mansion-construction-complete" rel="external nofollow">https://www.gta5-mods.com/maps/rockford-hills-mansion-construction-complete</a>
		</p>

		<p>
			- OpenIV<br /><a href="http://openiv.com/" rel="external nofollow">http://openiv.com/</a>
		</p>

		<p>
			- ArchieFix<br /><a href="https://cdn.discordapp.com/attachments/237446761441001475/237446813928521728/ArchiveFix.7z" rel="external nofollow">https://cdn.discordapp.com/attachments/237446761441001475/237446813928521728/ArchiveFix.7z</a>
		</p>

		<p>
			- ...and the generated keys for affixing.<br /><a href="https://cdn.discordapp.com/attachments/467088734899404811/533009597720428544/ArchiveFix_Keys.zip" rel="external nofollow">https://cdn.discordapp.com/attachments/467088734899404811/533009597720428544/ArchiveFix_Keys.zip</a>
		</p>

		<p>
			- A Ymap converter<br /><a href="https://www.gta5-mods.com/tools/mapeditor-2-ymap-converter" rel="external nofollow">https://www.gta5-mods.com/tools/mapeditor-2-ymap-converter</a>
		</p>

		<p>
			 
		</p>

		<p>
			 
		</p>
	</div>
</blockquote>

<p>
	1. First you're gonna need to gather all the tools needed to bring a mapping over to your RageMP server. I made a special folder for this tutorial.
</p>

<p>
	<img alt="SvSsmqN.png" class="ipsImage" height="606" src="https://i.imgur.com/SvSsmqN.png" width="1200" /></p>

<p>
	2. Okay so here's the two .xml maps both exported from Map Editor. (But you can export it from Menyoo too) 
</p>

<p>
	<img alt="OhWj6sQ.png" class="ipsImage" height="339" src="https://i.imgur.com/OhWj6sQ.png" width="793" /></p>

<p>
	3. So what we're gonna do next is open up ME2YM (Ymap converter) and try to convert it over.
</p>

<p>
	<img alt="DV3GXxB.png" class="ipsImage" height="301" src="https://i.imgur.com/DV3GXxB.png" width="739" /></p>

<p>
	 
</p>

<p>
	<img alt="6DNmxO5.png" class="ipsImage" height="608" src="https://i.imgur.com/6DNmxO5.png" width="1200" /></p>

<p>
	4. When you got it opened up, goto File &gt; Open. Then navigate your mapping, I will be bringing in my examples I got from GTA 5 Mods. (There's two of them, but I RECOMMEND you importing ONE at a time and converting them ONE AT A TIME.)
</p>

<p>
	<img alt="75k1a97.png" class="ipsImage" height="578" src="https://i.imgur.com/75k1a97.png" width="1200" /></p>

<p>
	5. After getting your mapping in ME2YM, goto File &gt; Export. And export your mapping anywhere you like. I'll be exporting mine in the same folder for the sake of the tutorial. (Again, LOOK back at number 4. ONLY import and export ONE mapping at a time.)
</p>

<p>
	<img alt="GQcnJDy.png" class="ipsImage" height="572" src="https://i.imgur.com/GQcnJDy.png" width="1200" /></p>

<p>
	6. Since there's two mappings, I'll basically be doing steps 4 and 5 again for the other one. Simple.
</p>

<p>
	7. After you've gotten those converted over, you're done with ME2YM! Open up OpenIV and navigate to your mapping dlcpack base by going to File &gt; Open folder. (In this case, if you downloaded my base, find "mapname")
</p>

<p>
	<img alt="zilAXrN.png" class="ipsImage" height="367" src="https://i.imgur.com/zilAXrN.png" width="499" /></p>

<p>
	 
</p>

<p>
	<img alt="ylLQ6Ag.png" class="ipsImage" height="170" src="https://i.imgur.com/ylLQ6Ag.png" width="313" /></p>

<p>
	8. You should see the dlc archive itself when opening up the dlcpack. Open it up and go all the way to the "custom_maps" .rpf archive. 
</p>

<p>
	9. Import the .ymap mappings through openFormats.
</p>

<p>
	<img alt="Ed3LhCU.png" class="ipsImage" height="259" src="https://i.imgur.com/Ed3LhCU.png" width="307" /></p>

<p>
	<img alt="mU9EIDj.png" class="ipsImage" height="321" src="https://i.imgur.com/mU9EIDj.png" width="505" /></p>

<p>
	10. Extract the custom_maps.rpf anywhere after importing your .ymap mappings, then DELETE the .rpf archive inside OpenIV after extracting it.
</p>

<p>
	<img alt="gBfjaMq.png" class="ipsImage" height="411" src="https://i.imgur.com/gBfjaMq.png" width="483" /></p>

<p>
	<img alt="f28Blw1.png" class="ipsImage" height="461" src="https://i.imgur.com/f28Blw1.png" width="541" /></p>

<p>
	11. Next we're gonna be affixing that .rpf archive. Locate ArchiveFix and where you placed your custom_maps.rpf then drag the .rpf archive onto the ArchiveFix icon.
</p>

<p>
	<img alt="wm9dkPN.png" class="ipsImage" height="552" src="https://i.imgur.com/wm9dkPN.png" width="1200" /></p>

<p>
	...and you should get this. Don't panic. It means you did something right...
</p>

<p>
	<img alt="ZO420Q9.png" class="ipsImage" height="189" src="https://i.imgur.com/ZO420Q9.png" width="1200" /></p>

<p>
	12. Re-add/Import that archive back into OpenIV in the same place where you deleted it from.
</p>

<p>
	13. Exit OpenIV, then locate your mapping base dlc archive. (If you're using mapname, it'll be in mapname..)
</p>

<p>
	14. Drag that .rpf archive into ArchiveFix like custom_maps.
</p>

<p>
	<img alt="uBMqPDA.png" class="ipsImage" height="490" src="https://i.imgur.com/uBMqPDA.png" width="1200" /></p>

<p>
	<img alt="yZjfQMU.png" class="ipsImage" height="156" src="https://i.imgur.com/yZjfQMU.png" width="1200" /></p>

<p>
	15. Then finally, go into your server's files and into client_resources. Then drop your mapping dlcpack base (or mapname) into dlcpack. (Make a dlcpack folder inside client_resources if you haven't made one.)
</p>

<p>
	16. Either copy it to your client_resources as well or be lazy and just hop in game to let the server download it for you. (If you let the server download it, restart your game and client after downloading it from the server.)
</p>

<p>
	17. Your mapping should be in the server for you and anyone else who joins! (Granted they download the resources too from the server..) <br />
	  
</p>

<p>
	<img alt="btMQomh.jpg" class="ipsImage" height="675" src="https://i.imgur.com/btMQomh.jpg" width="1200" /></p>
]]></description><guid isPermaLink="false">3261</guid><pubDate>Sun, 20 Jan 2019 22:51:28 +0000</pubDate></item><item><title>Cruise Control</title><link>https://rage.mp/forums/topic/991-cruise-control/</link><description><![CDATA[
<p>
	Hello Everyone,<br />
	 
</p>

<p>
	Today I would like to introduce a Tutorial about how to do Cruise control for your vehicle.
</p>

<p>
	The script generally sets your vehicle on a constant velocity without the need for you to accelerate, and you can have full control of the vehicle again by press the brakes or just run out of the car ;D (joke).
</p>

<p>
	Anyways it's simple
</p>

<p>
	<strong>Server-side:</strong>
</p>

<div class="ipsSpoiler" data-ipsspoiler="">
	<div class="ipsSpoiler_header">
		<span>Spoiler</span>
	</div>

	<div class="ipsSpoiler_contents">
		<pre class="ipsCode prettyprint lang-javascript prettyprinted">

<span class="pln">mp</span><span class="pun">.</span><span class="pln">events</span><span class="pun">.</span><span class="pln">add</span><span class="pun">({</span><span class="pln">
	</span><span class="str">'playerEnterVehicle'</span><span class="pun">:</span><span class="pln"> </span><span class="pun">(</span><span class="pln">player</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
		player</span><span class="pun">.</span><span class="pln">call</span><span class="pun">(</span><span class="str">'VehicleEnter'</span><span class="pun">,</span><span class="pln"> </span><span class="pun">[</span><span class="pln">player</span><span class="pun">.</span><span class="pln">seat</span><span class="pun">]);</span><span class="pln">
    </span><span class="pun">},</span><span class="pln">
  
  	</span><span class="str">'playerExitVehicle'</span><span class="pun">:</span><span class="pln"> </span><span class="pun">(</span><span class="pln">player</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
		player</span><span class="pun">.</span><span class="pln">call</span><span class="pun">(</span><span class="str">'VehicleExit'</span><span class="pun">,</span><span class="pln"> </span><span class="pun">[</span><span class="pln">player</span><span class="pun">.</span><span class="pln">seat</span><span class="pun">]);</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">});</span></pre>

		<p>
			This generally 2 events that calls the client side events and tells them about if the player entered the vehicle and is a Driver or not.
		</p>
	</div>
</div>

<p>
	<strong>Client-side:</strong>
</p>

<div class="ipsSpoiler" data-ipsspoiler="">
	<div class="ipsSpoiler_header">
		<span>Spoiler</span>
	</div>

	<div class="ipsSpoiler_contents">
		<pre class="ipsCode prettyprint lang-javascript prettyprinted">

<span class="kwd">let</span><span class="pln"> localPlayer </span><span class="pun">=</span><span class="pln"> mp</span><span class="pun">.</span><span class="pln">players</span><span class="pun">.</span><span class="pln">local</span><span class="pun">,</span><span class="pln">
    vehSeat</span><span class="pun">,</span><span class="pln"> vehMaxSpeed </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">null</span><span class="pun">,</span><span class="pln">
    state </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">

</span><span class="com">// Thanks to kemperr</span><span class="pln">
mp</span><span class="pun">.</span><span class="pln">gui</span><span class="pun">.</span><span class="pln">execute</span><span class="pun">(</span><span class="str">"const _enableChatInput = enableChatInput;enableChatInput = (enable) =&gt; { mp.trigger('chatEnabled', enable); _enableChatInput(enable) };"</span><span class="pun">);</span><span class="pln">
mp</span><span class="pun">.</span><span class="pln">events</span><span class="pun">.</span><span class="pln">add</span><span class="pun">(</span><span class="str">'chatEnabled'</span><span class="pun">,</span><span class="pln"> </span><span class="pun">(</span><span class="pln">isEnabled</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    mp</span><span class="pun">.</span><span class="pln">gui</span><span class="pun">.</span><span class="pln">chat</span><span class="pun">.</span><span class="pln">enabled </span><span class="pun">=</span><span class="pln"> isEnabled</span><span class="pun">;</span><span class="pln">
</span><span class="pun">});</span><span class="pln">

mp</span><span class="pun">.</span><span class="pln">events</span><span class="pun">.</span><span class="pln">add</span><span class="pun">({</span><span class="pln">
    </span><span class="str">'VehicleEnter'</span><span class="pun">:</span><span class="pln"> </span><span class="pun">(</span><span class="pln">seat</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">seat </span><span class="pun">===</span><span class="pln"> </span><span class="pun">-</span><span class="lit">1</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln"> localPlayer</span><span class="pun">.</span><span class="pln">vehicle</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="com">// if he/she was driver</span><span class="pln">
            vehSeat </span><span class="pun">=</span><span class="pln"> seat</span><span class="pun">;</span><span class="pln">
            vehMaxSpeed </span><span class="pun">=</span><span class="pln"> mp</span><span class="pun">.</span><span class="pln">game</span><span class="pun">.</span><span class="pln">vehicle</span><span class="pun">.</span><span class="pln">getVehicleModelMaxSpeed</span><span class="pun">(</span><span class="pln">localPlayer</span><span class="pun">.</span><span class="pln">vehicle</span><span class="pun">.</span><span class="pln">model</span><span class="pun">);</span><span class="pln">
            mp</span><span class="pun">.</span><span class="pln">game</span><span class="pun">.</span><span class="pln">graphics</span><span class="pun">.</span><span class="pln">notify</span><span class="pun">(`</span><span>Press</span><span class="pln"> </span><span class="pun">~</span><span class="pln">r</span><span class="pun">~</span><span class="pln">C </span><span class="kwd">if</span><span class="pln"> you want to start </span><span>Cruise</span><span class="pln"> control</span><span class="pun">.`);</span><span class="pln">
        </span><span class="pun">}</span><span class="pln">
    </span><span class="pun">},</span><span class="pln">
    </span><span class="str">'VehicleExit'</span><span class="pun">:</span><span class="pln"> </span><span class="pun">(</span><span class="pln">seat</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">seat </span><span class="pun">===</span><span class="pln"> </span><span class="pun">-</span><span class="lit">1</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
            state </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
        </span><span class="pun">}</span><span class="pln">
        vehSeat </span><span class="pun">=</span><span class="pln"> </span><span class="pun">-</span><span class="lit">2</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">},</span><span class="pln">

    </span><span class="str">'render'</span><span class="pun">:</span><span class="pln"> </span><span class="pun">()</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">state </span><span class="pun">==</span><span class="pln"> </span><span class="lit">1</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln"> localPlayer</span><span class="pun">.</span><span class="pln">vehicle</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="com">// if cruise was triggered</span><span class="pln">
            </span><span class="kwd">let</span><span class="pln"> currentvelo </span><span class="pun">=</span><span class="pln"> localPlayer</span><span class="pun">.</span><span class="pln">vehicle</span><span class="pun">.</span><span class="pln">getVelocity</span><span class="pun">();</span><span class="pln">

            currentvelo</span><span class="pun">.</span><span class="pln">x </span><span class="pun">=</span><span class="pln"> currentvelo</span><span class="pun">.</span><span class="pln">x </span><span class="pun">*</span><span class="pln"> </span><span class="lit">1.1</span><span class="pun">;</span><span class="pln">
            currentvelo</span><span class="pun">.</span><span class="pln">y </span><span class="pun">=</span><span class="pln"> currentvelo</span><span class="pun">.</span><span class="pln">y </span><span class="pun">*</span><span class="pln"> </span><span class="lit">1.1</span><span class="pun">;</span><span class="pln">

            localPlayer</span><span class="pun">.</span><span class="pln">vehicle</span><span class="pun">.</span><span class="pln">setVelocity</span><span class="pun">(</span><span class="pln">currentvelo</span><span class="pun">.</span><span class="pln">x</span><span class="pun">,</span><span class="pln"> currentvelo</span><span class="pun">.</span><span class="pln">y</span><span class="pun">,</span><span class="pln"> currentvelo</span><span class="pun">.</span><span class="pln">z</span><span class="pun">)</span><span class="pln"> </span><span class="com">// set velocity to the current one.</span><span class="pln">

            </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">localPlayer</span><span class="pun">.</span><span class="pln">vehicle</span><span class="pun">.</span><span class="pln">hasCollidedWithAnything</span><span class="pun">()</span><span class="pln"> </span><span class="pun">||</span><span class="pln"> localPlayer</span><span class="pun">.</span><span class="pln">vehicle</span><span class="pun">.</span><span class="pln">isInAir</span><span class="pun">())</span><span class="pln"> </span><span class="com">// check if vehicle did collision or went off the ground</span><span class="pln">
            </span><span class="pun">{</span><span class="pln">
                state </span><span class="pun">=</span><span class="pln"> </span><span class="lit">2</span><span class="pun">;</span><span class="pln"> </span><span class="com">// stop cruise</span><span class="pln">
                toggle</span><span class="pun">();</span><span class="pln">
            </span><span class="pun">}</span><span class="pln">

            </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">buttonchecker</span><span class="pun">())</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="com">// if space, enter, F, S buttons were triggered</span><span class="pln">
                state </span><span class="pun">=</span><span class="pln"> </span><span class="lit">2</span><span class="pun">;</span><span class="pln"> </span><span class="com">// stop cruise</span><span class="pln">
                toggle</span><span class="pun">();</span><span class="pln">
            </span><span class="pun">}</span><span class="pln">
        </span><span class="pun">};</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">});</span><span class="pln">

mp</span><span class="pun">.</span><span class="pln">keys</span><span class="pun">.</span><span class="pln">bind</span><span class="pun">(</span><span class="lit">0x43</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">,</span><span class="pln"> _ </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="com">// binding C to the cruise speed</span><span class="pln">
    </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">vehSeat </span><span class="pun">===</span><span class="pln"> </span><span class="pun">-</span><span class="lit">1</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln"> localPlayer</span><span class="pun">.</span><span class="pln">vehicle </span><span class="pun">&amp;&amp;</span><span class="pln"> </span><span class="pun">!</span><span class="pln">mp</span><span class="pun">.</span><span class="pln">gui</span><span class="pun">.</span><span class="pln">chat</span><span class="pun">.</span><span class="pln">enabled</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="com">// if he/she was driver and chat isn't active.</span><span class="pln">
        </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">state </span><span class="pun">==</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="pun">||</span><span class="pln"> state </span><span class="pun">==</span><span class="pln"> </span><span class="lit">2</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="com">// if cruise was disabled</span><span class="pln">
            state </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
            toggle</span><span class="pun">();</span><span class="pln"> </span><span class="com">// start the cruise</span><span class="pln">
        </span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">state </span><span class="pun">==</span><span class="pln"> </span><span class="lit">1</span><span class="pun">)</span><span class="pln"> </span><span class="com">// if cruise was enabled</span><span class="pln">
        </span><span class="pun">{</span><span class="pln">
            state </span><span class="pun">=</span><span class="pln"> </span><span class="lit">2</span><span class="pun">;</span><span class="pln">
            toggle</span><span class="pun">();</span><span class="pln"> </span><span class="com">// stop the cruise</span><span class="pln">
        </span><span class="pun">}</span><span class="pln">
    </span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">return</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">});</span><span class="pln">

</span><span class="kwd">function</span><span class="pln"> toggle</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="com">// Toggler of the Cruise speed.</span><span class="pln">
    </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">localPlayer</span><span class="pun">.</span><span class="pln">vehicle</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">switch</span><span class="pln"> </span><span class="pun">(</span><span class="pln">state</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
            </span><span class="kwd">case</span><span class="pln"> </span><span class="lit">1</span><span class="pun">:</span><span class="pln">
                </span><span class="pun">{</span><span class="pln">
                    </span><span class="kwd">let</span><span class="pln"> speed </span><span class="pun">=</span><span class="pln"> localPlayer</span><span class="pun">.</span><span class="pln">vehicle</span><span class="pun">.</span><span class="pln">getSpeed</span><span class="pun">();</span><span class="pln">
                    localPlayer</span><span class="pun">.</span><span class="pln">vehicle</span><span class="pun">.</span><span class="pln">setMaxSpeed</span><span class="pun">(</span><span class="pln">speed</span><span class="pun">);</span><span class="pln">
                    mp</span><span class="pun">.</span><span class="pln">game</span><span class="pun">.</span><span class="pln">graphics</span><span class="pun">.</span><span class="pln">notify</span><span class="pun">(`</span><span>Your</span><span class="pln"> cruise speed was </span><span class="kwd">set</span><span class="pln"> to </span><span class="pun">~</span><span class="pln">b</span><span class="pun">~</span><span class="pln">$</span><span class="pun">{(</span><span class="pln">speed </span><span class="pun">*</span><span class="pln"> </span><span class="lit">3.6</span><span class="pun">).</span><span class="pln">toFixed</span><span class="pun">(</span><span class="lit">0</span><span class="pun">)}~</span><span class="pln">b</span><span class="pun">~</span><span class="pln"> km</span><span class="pun">/</span><span class="pln">h</span><span class="pun">`);</span><span class="pln">
                    </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
                </span><span class="pun">}</span><span class="pln">
            </span><span class="kwd">case</span><span class="pln"> </span><span class="lit">2</span><span class="pun">:</span><span class="pln">
                </span><span class="pun">{</span><span class="pln">
                    localPlayer</span><span class="pun">.</span><span class="pln">vehicle</span><span class="pun">.</span><span class="pln">setMaxSpeed</span><span class="pun">(</span><span class="pln">vehMaxSpeed</span><span class="pun">);</span><span class="pln">
                    mp</span><span class="pun">.</span><span class="pln">game</span><span class="pun">.</span><span class="pln">graphics</span><span class="pun">.</span><span class="pln">notify</span><span class="pun">(`</span><span>Cruise</span><span class="pln"> speed is now </span><span class="pun">~</span><span class="pln">r</span><span class="pun">~</span><span class="pln">disabled</span><span class="pun">!</span><span class="pln"> </span><span>Drive</span><span class="pln"> safely</span><span class="pun">!`);</span><span class="pln">
                    state </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
                </span><span class="pun">}</span><span class="pln">
        </span><span class="pun">}</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">};</span><span class="pln">

</span><span class="kwd">function</span><span class="pln"> buttonchecker</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="com">// if user presses space, s , enter, or F returns true</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mp</span><span class="pun">.</span><span class="pln">keys</span><span class="pun">.</span><span class="pln">isDown</span><span class="pun">(</span><span class="lit">32</span><span class="pun">)</span><span class="pln"> </span><span class="pun">||</span><span class="pln"> mp</span><span class="pun">.</span><span class="pln">keys</span><span class="pun">.</span><span class="pln">isDown</span><span class="pun">(</span><span class="lit">83</span><span class="pun">)</span><span class="pln"> </span><span class="pun">||</span><span class="pln"> mp</span><span class="pun">.</span><span class="pln">keys</span><span class="pun">.</span><span class="pln">isDown</span><span class="pun">(</span><span class="lit">70</span><span class="pun">)</span><span class="pln"> </span><span class="pun">||</span><span class="pln"> mp</span><span class="pun">.</span><span class="pln">keys</span><span class="pun">.</span><span class="pln">isDown</span><span class="pun">(</span><span class="lit">13</span><span class="pun">))</span><span class="pln">
</span><span class="pun">};</span></pre>

		<p>
			 
		</p>
	</div>
</div>

<p>
	 
</p>

<p>
	Thank you and i wish you enjoyed the Tutorial. Wait for more soon!
</p>
]]></description><guid isPermaLink="false">991</guid><pubDate>Thu, 30 Nov 2017 20:11:46 +0000</pubDate></item><item><title>[Part 2] Coding a simple resource [NodeJS/VSC]</title><link>https://rage.mp/forums/topic/5113-part-2-coding-a-simple-resource-nodejsvsc/</link><description><![CDATA[<p>
	<u><strong>Disclaimer: If you dont know where to start, please go to: </strong></u>
</p>
<iframe allowfullscreen="" data-controller="core.front.core.autosizeiframe" data-embedauthorid="41636" data-embedcontent="" data-embedid="embed1668530654" scrolling="no" src="https://rage.mp/forums/topic/5103-part-1-setting-up-a-development-environment-nodejsvsc/?do=embed" style="height:204px;max-width:502px;"></iframe>

<p>
	So, you got NodeJS and Visual Studio Code running? Good, let's start coding!
</p>

<p>
	<strong>Step 1: Files</strong>
</p>

<p>
	<em>RESOURENAME is a placeholder. Name id how you want your Resource should be called, like Roleplay-Gamemode.</em>
</p>

<p>
	Open Visual Studio Code in the <em>C:/RAGEMP/server-files/packages</em> folder. Then, create a folder named <em>RESOURENAME </em>(Change that). In that folder, we create a file called <em>index.js</em>.  At that point, Visual Studio Code should look like this:
</p>

<p>
	<img alt="image.png" class="ipsImage" data-ratio="67.31" height="243" width="361" src="https://i.ibb.co/sQKQzJh/image.png" /></p>

<p>
	<strong>Step 2: Making a base</strong>
</p>

<p>
	In <em>RESOURENAME </em> create a file called <em>commands.js </em>
</p>

<p>
	Now head to <em>index.js</em> and type in following:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted">
<span class="pln">require</span><span class="pun">(</span><span class="str">"./commands.js"</span><span class="pun">);</span></pre>

<p>
	With that statement, we tell our resource that it should load the file called <em>commands.js</em>. You can to that even for folders, like:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted">
<span class="pln">require</span><span class="pun">(</span><span class="str">"./commands/vehicleCommand.js"</span><span class="pun">);</span></pre>

<p>
	 <strong>Step 3: Lets code!</strong>
</p>

<p>
	Javascript is a script language. That means, we don't need much constructers. Lets use that!:
</p>

<p>
	We want to make the simplest and most helpfull command: A /vehicle command! How we do that? Well, if you got into javascript, its not complicated.
</p>

<p>
	With the power of autocomplete, try to achieve following:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted">
<span class="pln">mp</span><span class="pun">.</span><span class="pln">events</span><span class="pun">.</span><span class="pln">addCommand</span><span class="pun">(</span><span class="str">"vehicle"</span><span class="pun">,</span><span class="pln"> </span><span class="pun">(</span><span class="pln">player</span><span class="pun">,</span><span class="pln"> vehicle</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

</span><span class="pun">});</span></pre>

<p>
	So, <span style="color:#16a085;">mp </span>is a <span style="color:#2980b9;">const</span>. That means, its a variable that we cant change. <span style="color:#16a085;">events </span>is a <span style="color:#2980b9;">property </span>of <span style="color:#16a085;">mp</span>. And <span style="color:#f1c40f;">addCommand </span>is a <span style="color:#2980b9;">method. </span><span style="color:#f1c40f;">addCommand </span>has the following usage:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted">
<span class="pln">mp</span><span class="pun">.</span><span class="pln">events</span><span class="pun">.</span><span class="pln">addCommand</span><span class="pun">(</span><span class="pln">commandName</span><span class="pun">,</span><span class="pln"> </span><span class="pun">(</span><span class="pln">player</span><span class="pun">,</span><span class="pln"> args</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

</span><span class="pun">});</span></pre>

<p>
	<em>commandName</em> is self-explaining, <em>player </em>too. But whats  <em>args?</em>
</p>

<p>
	<em>args </em>are our aguments. That means, we can add howmany we want. Our command above will be executed like this:
</p>

<pre class="ipsCode">
/vehicle VEHICLEHASH

//example:
/vehicle Alpha</pre>

<p>
	So, got that? Lets move on!
</p>

<p>
	Now we want that a vehicle spawns if we use that command, todo so:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted">
<span class="pln">mp</span><span class="pun">.</span><span class="pln">events</span><span class="pun">.</span><span class="pln">addCommand</span><span class="pun">(</span><span class="str">"vehicle"</span><span class="pun">,</span><span class="pln"> </span><span class="pun">(</span><span class="pln">player</span><span class="pun">,</span><span class="pln"> vehicle</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    mp</span><span class="pun">.</span><span class="pln">vehicles</span><span class="pun">.</span><span class="kwd">new</span><span class="pun">(</span><span class="pln">mp</span><span class="pun">.</span><span class="pln">joaat</span><span class="pun">(</span><span class="pln">vehicle</span><span class="pun">),</span><span class="pln"> player</span><span class="pun">.</span><span class="pln">position</span><span class="pun">);</span><span class="pln">
</span><span class="pun">});</span></pre>

<p>
	So, like before,  <span style="color:#16a085;">mp </span>is our <span style="color:#2980b9;">const</span>, <span style="color:#16a085;">vehicles </span>is a <span style="color:#2980b9;">property </span>of <span style="color:#16a085;">mp</span>. And <span style="color:#f1c40f;">new </span>is a <span style="color:#2980b9;">method</span>. same for <em>mp.joaat(). </em> <span style="color:#16a085;">mp </span>is our <span style="color:#2980b9;">const, a</span>nd <span style="color:#f1c40f;">joaat </span>is a <span style="color:#2980b9;">method </span>that returns a number.
</p>

<p>
	<em>player</em> is a variable, and <em>position</em> a property. <em>position </em>is from type <em>mp.Vector3.</em> Vectors are positions in RAGEMP, and our function <em>mp.vehicles.new</em> has the following usage:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted">
<span class="pln">mp</span><span class="pun">.</span><span class="pln">vehicles</span><span class="pun">.</span><span class="kwd">new</span><span class="pun">(</span><span class="pln">model</span><span class="pun">,</span><span class="pln"> position</span><span class="pun">,</span><span class="pln"> options</span><span class="pun">?);</span></pre>

<p>
	Whats <em>options?</em> ? If a variable has a ? behind, that means its optional. So you dont need to set that.
</p>

<p>
	Lets safe everything, and it should work!
</p>

<p>
	If you got questions, look at the Wiki! (<a href="https://wiki.rage.mp/index.php?title=Main_Page" rel="">https://wiki.rage.mp/index.php?title=Main_Page</a>)
</p>

<p>
	Here are some usefull Wiki pages:
</p>

<p>
	<a href="https://wiki.rage.mp/index.php?title=Getting_Started_with_Commands" rel="">https://wiki.rage.mp/index.php?title=Getting_Started_with_Commands</a>
</p>

<p>
	<a href="https://wiki.rage.mp/index.php?title=Getting_Started_with_Client-side" rel="">https://wiki.rage.mp/index.php?title=Getting_Started_with_Client-side</a>
</p>

<p>
	<a href="https://wiki.rage.mp/index.php?title=Getting_Started_with_Events" rel="">https://wiki.rage.mp/index.php?title=Getting_Started_with_Events</a>
</p>

<p>
	Stay tuned for Part 3!
</p>]]></description><guid isPermaLink="false">5113</guid><pubDate>Wed, 24 Jul 2019 11:16:08 +0000</pubDate></item><item><title>How to stop playing losing hp when running for too long</title><link>https://rage.mp/forums/topic/2959-how-to-stop-playing-losing-hp-when-running-for-too-long/</link><description><![CDATA[
<p>
	This occurs due to player stamina hitting zero, resulting in hp being lost. Below is the workaround for this in both <strong>C#</strong> and <strong>JavaScript</strong>.
</p>

<p>
	<u><strong>C#</strong></u>
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted">
<span class="com">//Subscribe the Tick event</span><span class="pln">
</span><span>Events</span><span class="pun">.</span><span>Tick</span><span class="pln"> </span><span class="pun">+=</span><span class="pln"> </span><span>Tick</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span>Tick</span><span class="pun">(</span><span>List</span><span class="pun">&lt;</span><span>Events</span><span class="pun">.</span><span>TickNametagData</span><span class="pun">&gt;</span><span class="pln"> nametags</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    RAGE</span><span class="pun">.</span><span>Game</span><span class="pun">.</span><span>Player</span><span class="pun">.</span><span>RestorePlayerStamina</span><span class="pun">(</span><span class="lit">1.0F</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	<u><strong>JavaScript</strong></u>
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted">
<span class="pln">mp</span><span class="pun">.</span><span class="pln">events</span><span class="pun">.</span><span class="pln">add</span><span class="pun">(</span><span class="str">'render'</span><span class="pun">,</span><span class="pln"> </span><span class="pun">()</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    mp</span><span class="pun">.</span><span class="pln">game</span><span class="pun">.</span><span class="pln">player</span><span class="pun">.</span><span class="pln">restoreStamina</span><span class="pun">(</span><span class="lit">100</span><span class="pun">);</span><span class="pln">
</span><span class="pun">});</span></pre>

<p>
	 
</p>
]]></description><guid isPermaLink="false">2959</guid><pubDate>Wed, 12 Dec 2018 17:33:32 +0000</pubDate></item><item><title>Simple server-time code + fix GetTime (C#)</title><link>https://rage.mp/forums/topic/4908-simple-server-time-code-fix-gettime-c/</link><description><![CDATA[<p>
	Once I faced a problem with NAPI.World.GetTime and didn't find on it the adequate answer. Can anyone help my code. Bonus will make a simple server time system
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted">
<span class="kwd">class</span><span class="pln"> server_side </span><span class="pun">:</span><span class="pln"> </span><span class="typ">Script</span><span class="pln">
 ﻿   </span><span class="pun">{</span><span class="pln">
        </span><span class="com">// The global variables that will be replace our GetTime</span><span class="pln">
        </span><span class="typ">int</span><span class="pln"> serverHour </span><span class="pun">=</span><span class="pln"> </span><span class="lit">6</span><span class="pun">;</span><span class="pln">
        </span><span class="typ">int</span><span class="pln"> serverMin </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
        </span><span class="typ">int</span><span class="pln"> serverSec </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">

		</span><span class="com">// A method that, when accessed, will change the time on the server</span><span class="pln">
        </span><span class="kwd">private</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> server_Time</span><span class="pun">(</span><span class="typ">int</span><span class="pln"> hour</span><span class="pun">,</span><span class="pln"> </span><span class="typ">int</span><span class="pln"> minute</span><span class="pun">,</span><span class="pln"> </span><span class="typ">int</span><span class="pln"> second</span><span class="pun">)</span><span class="pln">
        </span><span class="pun">{</span><span class="pln">
            NAPI</span><span class="pun">.</span><span class="typ">World</span><span class="pun">.</span><span class="typ">SetTime</span><span class="pun">(</span><span class="pln">hour</span><span class="pun">,</span><span class="pln"> minute</span><span class="pun">,</span><span class="pln"> second</span><span class="pun">);</span><span class="pln">
            serverHour </span><span class="pun">=</span><span class="pln"> hour</span><span class="pun">;</span><span class="pln"> </span><span class="com">// ----------------------------------</span><span class="pln">
            serverMin </span><span class="pun">=</span><span class="pln"> minute</span><span class="pun">;</span><span class="pln"> </span><span class="com">// save in our variable time</span><span class="pln">
            serverSec </span><span class="pun">=</span><span class="pln"> second</span><span class="pun">;</span><span class="pln"> </span><span class="com">// ---------------------------------</span><span class="pln">
        </span><span class="pun">}</span><span class="pln">
﻿
		</span><span class="com">// Bonus code that creates server time (1 server minute = 20 seconds)</span><span class="pln">
        async </span><span class="kwd">void</span><span class="pln"> time</span><span class="pun">()</span><span class="pln">
        </span><span class="pun">{</span><span class="pln">
                </span><span class="kwd">while</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">true</span><span class="pun">)</span><span class="pln">
                </span><span class="pun">{﻿
                    </span><span class="pln">serverMin</span><span class="pun">++;</span><span class="pln">
                    NAPI</span><span class="pun">.</span><span class="typ">World</span><span class="pun">.</span><span class="typ">SetTime</span><span class="pun">(</span><span class="pln">serverHour</span><span class="pun">,</span><span class="pln"> serverMin</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
                    </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">serverMin </span><span class="pun">==</span><span class="pln"> </span><span class="lit">60</span><span class="pun">)</span><span class="pln">
                    </span><span class="pun">{</span><span class="pln">
                        </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">serverHour </span><span class="pun">&gt;=</span><span class="pln"> </span><span class="lit">23</span><span class="pun">)</span><span class="pln">
                        </span><span class="pun">{</span><span class="pln">
                            serverHour </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
                            serverMin </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
                            NAPI</span><span class="pun">.</span><span class="typ">World</span><span class="pun">.</span><span class="typ">SetTime</span><span class="pun">(</span><span class="pln">serverHour</span><span class="pun">,</span><span class="pln"> serverMin</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
                        </span><span class="pun">}</span><span class="pln">
                        </span><span class="kwd">else</span><span class="pln">
                        </span><span class="pun">{</span><span class="pln">
                            serverHour</span><span class="pun">++;</span><span class="pln">
                            serverMin </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
                            NAPI</span><span class="pun">.</span><span class="typ">World</span><span class="pun">.</span><span class="typ">SetTime</span><span class="pun">(</span><span class="pln">serverHour</span><span class="pun">,</span><span class="pln"> serverMin</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
                        </span><span class="pun">}</span><span class="pln">
                    </span><span class="pun">}</span><span class="pln">
                    await </span><span class="typ">Task</span><span class="pun">.</span><span class="typ">Delay</span><span class="pun">(</span><span class="lit">20000</span><span class="pun">);</span><span class="pln">
                </span><span class="pun">}</span><span class="pln">
        </span><span class="pun">}</span><span class="pln">

        </span><span class="pun">[</span><span class="typ">Command</span><span class="pun">(</span><span class="str">"time"</span><span class="pun">)]</span><span class="pln"> </span><span class="com">// command to know the current time on the server</span><span class="pln">
        </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> CMD_time</span><span class="pun">(</span><span class="typ">Client</span><span class="pln"> client</span><span class="pun">)</span><span class="pln">
        </span><span class="pun">{</span><span class="pln">
            </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">serverMin </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">10</span><span class="pun">)</span><span class="pln">
            </span><span class="pun">{</span><span class="pln">
                NAPI</span><span class="pun">.</span><span class="typ">Chat</span><span class="pun">.</span><span class="typ">SendChatMessageToPlayer</span><span class="pun">(</span><span class="pln">client</span><span class="pun">,</span><span class="pln"> $</span><span class="str">"Current time {serverHour.ToString()}:0{serverMin.ToString()}"</span><span class="pun">);</span><span class="pln">
            </span><span class="pun">}</span><span class="pln">
            </span><span class="kwd">else</span><span class="pln">
            </span><span class="pun">{﻿
                </span><span class="pln">NAPI</span><span class="pun">.</span><span class="typ">Chat</span><span class="pun">.</span><span class="typ">SendChatMessageToPlayer</span><span class="pun">(</span><span class="pln">client</span><span class="pun">,</span><span class="pln"> $</span><span class="str">"Current time {serverHour.ToString()}:{serverMin.ToString()}"</span><span class="pun">);</span><span class="pln">
            </span><span class="pun">}</span><span class="pln">
        </span><span class="pun">}</span><span class="pln">
                               
        </span><span class="com">// Change the time on the server</span><span class="pln">
        </span><span class="pun">[</span><span class="typ">Command</span><span class="pun">(</span><span class="str">"settime"</span><span class="pun">)]</span><span class="pln">
        </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> CMD_settime</span><span class="pun">(</span><span class="typ">Client</span><span class="pln"> client</span><span class="pun">,</span><span class="pln"> </span><span class="typ">int</span><span class="pln"> hrs</span><span class="pun">,</span><span class="pln"> </span><span class="typ">int</span><span class="pln"> min</span><span class="pun">)</span><span class="pln">
        </span><span class="pun">{</span><span class="pln">
            server_Time</span><span class="pun">(</span><span class="pln">hrs</span><span class="pun">,</span><span class="pln"> min</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
            NAPI</span><span class="pun">.</span><span class="typ">Chat</span><span class="pun">.</span><span class="typ">SendChatMessageToPlayer</span><span class="pun">(</span><span class="pln">client</span><span class="pun">,</span><span class="pln"> $</span><span class="str">"Time was change to {hrs}:{min}"</span><span class="pun">);</span><span class="pln">
        </span><span class="pun">}</span><span class="pln">
        </span><span class="com">// Event that the time worked</span><span class="pln">
		</span><span class="pun">[</span><span class="typ">ServerEvent</span><span class="pun">(</span><span class="typ">Event</span><span class="pun">.</span><span class="typ">ResourceStart</span><span class="pun">)]</span><span class="pln">
        </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">OnResourceStart</span><span class="pun">()</span><span class="pln">
        </span><span class="pun">{</span><span class="pln">
            NAPI</span><span class="pun">.</span><span class="typ">World</span><span class="pun">.</span><span class="typ">SetTime</span><span class="pun">(</span><span class="pln">serverHour</span><span class="pun">,</span><span class="pln"> serverMin</span><span class="pun">,</span><span class="pln"> serverSec</span><span class="pun">);</span><span class="pln">
            time</span><span class="pun">();</span><span class="pln"> </span><span class="com">// Cycle start time at the start of the server</span><span class="pln">
        </span><span class="pun">}</span></pre>

<p>
	 
</p>

<p>
	sorry for my russian english xd i hope this will help u <span class="ipsEmoji">❤️</span>
</p>]]></description><guid isPermaLink="false">4908</guid><pubDate>Wed, 10 Jul 2019 18:10:37 +0000</pubDate></item><item><title>[Snippet] Raise/Lower Windows With Commands (Client) [V 1.1]</title><link>https://rage.mp/forums/topic/4864-snippet-raiselower-windows-with-commands-client-v-11/</link><description><![CDATA[<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		Quote
	</div>

	<div class="ipsQuote_contents">
		<p>
			<span style="color:#e74c3c;"><strong>EDIT - JULY 9, 2019: </strong></span> I managed to handle the error when not in a vehicle! Next up is creating the key-binds. <span><span><img alt=":)" data-emoticon="" height="20" src="https://rage.mp/uploads/emoticons/smile.png" srcset="https://rage.mp/uploads/emoticons/smile@2x.png 2x" title=":)" width="20" />  I've also updated the code to make it easier to read.</span></span>
		</p>
	</div>
</blockquote>

<p>
	I haven't found this on the forums yet so I thought I'd share my code that is a work in progress. I'm fairly new to JavaScript and I'm still adapting, but hopefully some of you can make something out of this. Like I said, it is a work in progress, so if you'd like to contribute to it, please do so and I will happily add it to the main source code and give you credit for contribution.
</p>

<p>
	Right now, all commands work, however, there is an error when the player is not in a vehicle. I haven't been able to figure it out yet (I know it's probably stupidly easy).<br />
	Other than that, I am working on implementing keybinds once I manage to get all the functions to work in a toggle function. Also, it is only Client Side, so this is not synced!
</p>

<p>
	<em>I've also created a custom function which rolls all the windows up since RAGEMP doesn't have one in their documentation.</em>
</p>

<p>
	To implement this all you have to do is:
</p>

<p>
	<strong>1)</strong> Create a new folder in: <strong>client_resources</strong> (name it whatever you'd like)<br /><strong>2)</strong> Create a new JS file called: <strong>index.js</strong> (in folder you created within client_resources - call it whatever you'd like)<br /><strong>3) Include the snippet in your main index.js in the root of client_resources: </strong>
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted">
<span class="pln">require</span><span class="pun">(./</span><span class="pln">YOURFOLDERNAME</span><span class="pun">)</span></pre>

<p>
	<br /><strong>Copy &amp; paste this code:</strong>
</p>

<div class="ipsSpoiler" data-ipsspoiler="">
	<div class="ipsSpoiler_header">
		<span>Spoiler</span>
	</div>

	<div class="ipsSpoiler_contents">
		<p>
			 
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted">

<span class="kwd">const</span><span class="pln"> blockedClasses </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="lit">13</span><span class="pun">,</span><span class="pln"> </span><span class="lit">14</span><span class="pun">,</span><span class="pln"> </span><span class="lit">15</span><span class="pun">,</span><span class="pln"> </span><span class="lit">16</span><span class="pun">,</span><span class="pln"> </span><span class="lit">21</span><span class="pun">];</span><span class="pln">	</span><span class="com">// Blocks Aeroplanes, Boats, etc.</span><span class="pln">
	
	mp</span><span class="pun">.</span><span class="pln">events</span><span class="pun">.</span><span class="pln">add</span><span class="pun">(</span><span class="str">"playerCommand"</span><span class="pun">,</span><span class="pln"> </span><span class="pun">(</span><span class="pln">command</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

		</span><span class="com">// VARIABLES</span><span class="pln">
		</span><span class="kwd">const</span><span class="pln"> localPlayer </span><span class="pun">=</span><span class="pln"> mp</span><span class="pun">.</span><span class="pln">players</span><span class="pun">.</span><span class="pln">local</span><span class="pun">;</span><span class="pln">
		</span><span class="kwd">const</span><span class="pln"> localVehicle </span><span class="pun">=</span><span class="pln"> mp</span><span class="pun">.</span><span class="pln">players</span><span class="pun">.</span><span class="pln">local</span><span class="pun">.</span><span class="pln">vehicle</span><span class="pun">;</span><span class="pln">
   	 	</span><span class="kwd">const</span><span class="pln"> args </span><span class="pun">=</span><span class="pln"> command</span><span class="pun">.</span><span class="pln">split</span><span class="pun">(</span><span class="str">/[ ]+/</span><span class="pun">);</span><span class="pln">
		</span><span class="kwd">const</span><span class="pln"> commandName </span><span class="pun">=</span><span class="pln"> args</span><span class="pun">[</span><span class="lit">0</span><span class="pun">];</span><span class="pln">
		</span><span class="kwd">var</span><span class="pln"> vehicle </span><span class="pun">=</span><span class="pln"> localPlayer</span><span class="pun">.</span><span class="pln">localVehicle</span><span class="pun">;</span><span class="pln">
		</span><span class="kwd">var</span><span class="pln"> player </span><span class="pun">=</span><span class="pln"> player</span><span class="pun">;</span><span class="pln">

		</span><span class="com">// CHECK IF THE PLAYER IS INSIDE A VEHICLE</span><span class="pln">
		</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(!</span><span class="pln">localPlayer</span><span class="pun">.</span><span class="pln">vehicle </span><span class="pun">&amp;&amp;</span><span class="pln"> commandName </span><span class="pun">!=</span><span class="pln"> </span><span class="pun">[</span><span class="str">'flwup'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'flwdown'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'frwup'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'frwdown'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'blwup'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'blwdown'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'brwup'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'brwdown'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'wdown'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'wup'</span><span class="pun">])</span><span class="pln">
		</span><span class="pun">{</span><span class="pln"> </span><span class="kwd">return</span><span class="pln"> </span><span class="kwd">null</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">

		</span><span class="com">// COMMANDS FOR WINDOWS</span><span class="pln">
		</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">commandName </span><span class="pun">==</span><span class="pln"> </span><span class="str">'flwup'</span><span class="pun">)</span><span class="pln">			</span><span class="com">// Front Left Window</span><span class="pln">
		</span><span class="pun">{</span><span class="pln">localVehicle</span><span class="pun">.</span><span class="pln">rollUpWindow</span><span class="pun">(</span><span class="lit">0</span><span class="pun">);}</span><span class="pln">
		</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">commandName </span><span class="pun">===</span><span class="pln"> </span><span class="str">'flwdown'</span><span class="pun">)</span><span class="pln">	
		</span><span class="pun">{</span><span class="pln">localVehicle</span><span class="pun">.</span><span class="pln">rollDownWindow</span><span class="pun">(</span><span class="lit">0</span><span class="pun">);}</span><span class="pln">
		</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">commandName </span><span class="pun">===</span><span class="pln"> </span><span class="str">'frwup'</span><span class="pun">)</span><span class="pln">		</span><span class="com">// Front Right Window</span><span class="pln">
		</span><span class="pun">{</span><span class="pln">localVehicle</span><span class="pun">.</span><span class="pln">rollUpWindow</span><span class="pun">(</span><span class="lit">1</span><span class="pun">);}</span><span class="pln">
		</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">commandName </span><span class="pun">===</span><span class="pln"> </span><span class="str">'frwdown'</span><span class="pun">)</span><span class="pln">		
		</span><span class="pun">{</span><span class="pln">localVehicle</span><span class="pun">.</span><span class="pln">rollDownWindow</span><span class="pun">(</span><span class="lit">1</span><span class="pun">);}</span><span class="pln">
		</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">commandName </span><span class="pun">===</span><span class="pln"> </span><span class="str">'blwup'</span><span class="pun">)</span><span class="pln">		</span><span class="com">// Back Left Window</span><span class="pln">
		</span><span class="pun">{</span><span class="pln">localVehicle</span><span class="pun">.</span><span class="pln">rollUpWindow</span><span class="pun">(</span><span class="lit">2</span><span class="pun">);}</span><span class="pln">
		</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">commandName </span><span class="pun">===</span><span class="pln"> </span><span class="str">'blwdown'</span><span class="pun">)</span><span class="pln">
		</span><span class="pun">{</span><span class="pln">localVehicle</span><span class="pun">.</span><span class="pln">rollDownWindow</span><span class="pun">(</span><span class="lit">2</span><span class="pun">);}</span><span class="pln">
		</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">commandName </span><span class="pun">===</span><span class="pln"> </span><span class="str">'brwup'</span><span class="pun">)</span><span class="pln">		</span><span class="com">// Back Right Window</span><span class="pln">
		</span><span class="pun">{</span><span class="pln">localVehicle</span><span class="pun">.</span><span class="pln">rollUpWindow</span><span class="pun">(</span><span class="lit">3</span><span class="pun">);}</span><span class="pln">
		</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">commandName </span><span class="pun">===</span><span class="pln"> </span><span class="str">'brwdown'</span><span class="pun">)</span><span class="pln">		
		</span><span class="pun">{</span><span class="pln">localVehicle</span><span class="pun">.</span><span class="pln">rollDownWindow</span><span class="pun">(</span><span class="lit">3</span><span class="pun">);}</span><span class="pln">
		</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">commandName </span><span class="pun">===</span><span class="pln"> </span><span class="str">'wdown'</span><span class="pun">)</span><span class="pln">		
		</span><span class="pun">{</span><span class="pln">localVehicle</span><span class="pun">.</span><span class="pln">rollDownWindows</span><span class="pun">();}</span><span class="pln">		</span><span class="com">// Lowers All The Windows</span><span class="pln">
		</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">commandName </span><span class="pun">===</span><span class="pln"> </span><span class="str">'wup'</span><span class="pun">)</span><span class="pln">			
		</span><span class="pun">{</span><span class="pln">mp</span><span class="pun">.</span><span class="pln">events</span><span class="pun">.</span><span class="pln">call</span><span class="pun">(</span><span class="str">"rollUpWindows"</span><span class="pun">)};</span><span class="pln">
	
	</span><span class="pun">});</span><span class="pln">

	</span><span class="com">// EVENT FUNCTION FOR ROLLING UP ALL WINDOWS</span><span class="pln">
	mp</span><span class="pun">.</span><span class="pln">events</span><span class="pun">.</span><span class="pln">add</span><span class="pun">(</span><span class="str">"rollUpWindows"</span><span class="pun">,</span><span class="pln"> </span><span class="pun">(</span><span class="pln">vehicle</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
		</span><span class="kwd">var</span><span class="pln"> vehicle </span><span class="pun">=</span><span class="pln"> mp</span><span class="pun">.</span><span class="pln">players</span><span class="pun">.</span><span class="pln">local</span><span class="pun">.</span><span class="pln">vehicle</span><span class="pun">;</span><span class="pln">
		vehicle</span><span class="pun">.</span><span class="pln">rollUpWindow</span><span class="pun">(</span><span class="lit">0</span><span class="pun">);</span><span class="pln">
		vehicle</span><span class="pun">.</span><span class="pln">rollUpWindow</span><span class="pun">(</span><span class="lit">1</span><span class="pun">);</span><span class="pln">
		vehicle</span><span class="pun">.</span><span class="pln">rollUpWindow</span><span class="pun">(</span><span class="lit">2</span><span class="pun">);</span><span class="pln">
		vehicle</span><span class="pun">.</span><span class="pln">rollUpWindow</span><span class="pun">(</span><span class="lit">3</span><span class="pun">);</span><span class="pln">
	</span><span class="pun">});</span></pre>

		<p>
			 
		</p>

		<p>
			 
		</p>

		<p>
			 
		</p>
	</div>
</div>

<p>
	 
</p>

<p>
	And that's it!<br />
	All commands are interchangeable just by directly changing the "commandName".<br /><br />
	Hope this helps out some of you! (PS - It's my first script ever for RAGEMP, so please don't be too harsh. <span><img alt=":P" data-emoticon="" height="20" src="https://rage.mp/uploads/emoticons/tongue.png" srcset="https://rage.mp/uploads/emoticons/tongue@2x.png 2x" title=":P" width="20" /> )</span>
</p>]]></description><guid isPermaLink="false">4864</guid><pubDate>Mon, 08 Jul 2019 19:32:06 +0000</pubDate></item><item><title>First step to sync your own Peds!</title><link>https://rage.mp/forums/topic/4806-first-step-to-sync-your-own-peds/</link><description><![CDATA[
<p>
	Hello RAGE Beast's!
</p>

<p>
	I want to write this tutorial instead of releasing my packages with the Ped-Syncing, so people wont get spoonfeeded and everyone who can code and use brain, can reconstruct what i've done in many hours of work. In this tutorial i just want to show, or explain, the basics of syncinc peds for everybody at the server.
</p>

<p>
	First of all we need to start thinking about, what we need, and how we can realize our idea of syncing them.
</p>

<p>
	 
</p>

<p>
	I've started to get more knowledge about how pedestrians work on GTA and how i can control the activities of what they do.. so i've sit down.. working hours on studying natives, functions, behaviour and some more stuff about how to get "life" into a spawned ped object. At the start i've just controlled them client-sided.. playing animations, let them walk around.. and such stuff.
</p>

<p>
	After this i came to the conclusion that i'll not get far in programming with the given functions GTA5 handles to me.. Since we've no direct access to the engine / internals of GTA i've need to build my own "AI" to make the Peds "think" what they do. The restriction of not having access to control internal stuff is starting at directly receive informations what the ped is doing.. which animation is tasked.. and s lot of other problems who popped up.
</p>

<p>
	 
</p>

<p>
	So i've sit down again, starting to construct new classes.. kind of creating my own Controling-Class of my Peds, instead of using RAGEMP's one. You can use RAGEMP's "mp.peds.new" but i just wanted to make clear, i'm using my own stuff. The controlling class is working with the Natives of GTA5. So the class manage to spawn peds and directly put the handle into a class-object which contains all informations of what i do with them.. positions, animations, flags (walking, running, random walking).. 
</p>

<p>
	 
</p>

<p>
	Since we've a unique ID for each ped, we can control them via ID's and our Control-Class has the ability to pick out those ID's and control the single ped. Since everything is stored in the class.. we need to start working on functions which give our Peds an own AI.
</p>

<p>
	First of all we need to know math (vectors, cos / sinus / tan), thanks to RAGE and GTA we've also got ray-casting. At this tutorial i'll just explain how to let them walk in one direction... with a "random" heading (15°-20°) to left or right.. Kind of a "human" natural walk. Since ped.getHeading() isnt that accurate for our AI.. we need to use our own "heading" variable.. so i've just popped it into my Ped-Class.. and we also need to check the "old" and the "new" position of where the Ped should work.
</p>

<p>
	Let's store the "old" position before we set a new one.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted">
<span class="kwd">this</span><span class="pun">.</span><span class="pln">oldPos </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> mp</span><span class="pun">.</span><span>Vector3</span><span class="pun">(</span><span class="kwd">this</span><span class="pun">.</span><span class="pln">handle</span><span class="pun">.</span><span class="pln">getCoords</span><span class="pun">(</span><span class="kwd">false</span><span class="pun">).</span><span class="pln">x</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">handle</span><span class="pun">.</span><span class="pln">getCoords</span><span class="pun">(</span><span class="kwd">false</span><span class="pun">).</span><span class="pln">y</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">handle</span><span class="pun">.</span><span class="pln">getCoords</span><span class="pun">(</span><span class="kwd">false</span><span class="pun">).</span><span class="pln">z</span><span class="pun">);</span></pre>

<p>
	 
</p>

<p>
	After this we create our "random" heading. To the "old" heading we add the needed "left" or "right" pitch. So we create a temporary variable storing our old heading in it and add a random value.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted">
<span class="kwd">var</span><span class="pln"> randomHeading </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">oldHeading </span><span class="pun">+</span><span class="pln"> </span><span class="pun">((</span><span>Math</span><span class="pun">.</span><span class="pln">random</span><span class="pun">()</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="lit">1.0</span><span class="pun">)</span><span class="pln"> </span><span class="pun">-</span><span class="pln"> </span><span class="lit">0.5</span><span class="pun">);</span><span class="pln">
</span><span class="kwd">this</span><span class="pun">.</span><span class="pln">newHeading </span><span class="pun">=</span><span class="pln"> randomHeading</span><span class="pun">;</span></pre>

<p>
	You need to think about that we're using cos/sin and to make sure that you know we're working inside of a coordinate/vector system. (x/y/z) So you need to think about the relations about degree and single steps inside of a coordinate system. (1 is a unit of length)
</p>

<p>
	After this we're going to calculate the new position in relation to your null-point (the player) so we pick our "new" heading and multiply it by 3. (1 unit is like 1 ingame meter)
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted">
<span class="kwd">var</span><span class="pln"> headingX </span><span class="pun">=</span><span class="pln"> </span><span>Math</span><span class="pun">.</span><span class="pln">cos</span><span class="pun">(</span><span class="kwd">this</span><span class="pun">.</span><span class="pln">newHeading</span><span class="pun">)</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="lit">3</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">var</span><span class="pln"> headingY </span><span class="pun">=</span><span class="pln"> </span><span>Math</span><span class="pun">.</span><span class="pln">sin</span><span class="pun">(</span><span class="kwd">this</span><span class="pun">.</span><span class="pln">newHeading</span><span class="pun">)</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="lit">3</span><span class="pun">;</span></pre>

<p>
	 
</p>

<p>
	Since we've got your range from direct null-point we need to add those headingX / headingY to your real player coordinates. (x / y)
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted">
<span class="kwd">var</span><span class="pln"> position </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">handle</span><span class="pun">.</span><span class="pln">getCoords</span><span class="pun">(</span><span class="kwd">false</span><span class="pun">);</span><span class="pln">
</span><span class="kwd">this</span><span class="pun">.</span><span class="pln">newPos </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> mp</span><span class="pun">.</span><span>Vector3</span><span class="pun">(</span><span class="pln">position</span><span class="pun">.</span><span class="pln">x </span><span class="pun">+</span><span class="pln"> headingX</span><span class="pun">,</span><span class="pln"> position</span><span class="pun">.</span><span class="pln">y </span><span class="pun">+</span><span class="pln"> headingY</span><span class="pun">,</span><span class="pln"> position</span><span class="pun">.</span><span class="pln">z</span><span class="pun">);</span></pre>

<p>
	Since Z is the same and remains the same.. we dont need a tan.
</p>

<p>
	So we've got our "new" position out of this calulcation. 
</p>

<p>
	<img alt="AM43epM.png" class="ipsImage" height="418" src="https://i.imgur.com/AM43epM.png" width="380" /></p>

<p>
	 
</p>

<p>
	After this we're going to check if the new position is traceable / ray-cast.. so we check if the ped is running / walking against a wall or not. You can find this function inside the RAGE Wiki. (raytrace) If there is no object between the old position and the new position.. you can set the ped walking at the position. If there is something between the old and new position.. You'll need to take care to walk or recalculate the path.
</p>

<p>
	At my point, i've just set the heading * 2.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted">
<span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">isTraceable</span><span class="pun">(</span><span class="kwd">this</span><span class="pun">.</span><span class="pln">oldPos</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">newPos</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
	</span><span class="kwd">this</span><span class="pun">.</span><span class="pln">walk</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> mp</span><span class="pun">.</span><span>Vector3</span><span class="pun">(</span><span class="pln">position</span><span class="pun">.</span><span class="pln">x </span><span class="pun">+</span><span class="pln"> headingX</span><span class="pun">,</span><span class="pln"> position</span><span class="pun">.</span><span class="pln">y </span><span class="pun">+</span><span class="pln"> headingY</span><span class="pun">,</span><span class="pln"> position</span><span class="pun">.</span><span class="pln">z</span><span class="pun">));</span><span class="pln">
	</span><span class="kwd">this</span><span class="pun">.</span><span class="pln">oldHeading </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">newHeading</span><span class="pun">;</span><span class="pln">
	</span><span class="kwd">this</span><span class="pun">.</span><span class="pln">position </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">newPos</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
	</span><span class="kwd">this</span><span class="pun">.</span><span class="pln">oldHeading </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">newHeading </span><span class="pun">*</span><span class="pln"> </span><span class="lit">2</span><span class="pun">;</span><span class="pln">
	</span><span class="kwd">this</span><span class="pun">.</span><span class="pln">randomwalk</span><span class="pun">();</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	 
</p>

<p>
	So the rest of the other stuff, you can do it.. if you know where we are at the current point. We've done our client-side stuff.. so we need to go over how to sync the ped with the players.
</p>

<p>
	The biggest question is how to get the sync between the server and the client. Since we're storing all information about our ped at our client.. we need to send it to the server.. but we need to take care that we don't spam the server with our informations and also take care to send smallest infos as possible.. think about that there could be hundret of players who send informations.. so take care of resources.
</p>

<p>
	<img alt="p6hQWYC.png" class="ipsImage" height="563" src="https://i.imgur.com/p6hQWYC.png" width="897" /></p>

<p>
	The red dots are the peds of other users.. as client.. we dont need to send the informations of them to the server.. since they're controlled by another user.
</p>

<p>
	The green dots are the peds of our user.. as client.. we need to send the informations to the server.. cuz we control them.
</p>

<p>
	The blue dots are all peds stored at the server.. which contains informations.. (ids, positions, ...) the server sends the information the the clients
</p>

<p>
	The orange dots are all peds who aren't created at the client-side and theyre from other users.. so you need to create them and update the information of them.
</p>

<p>
	 
</p>

<p>
	I decided to just send the unique ID and the position data and also the flags to the server.. At the server we've got also a class with the informations.. kind of we build at our client. We need some functions to check if the unique ID already exists.. and if we can update the informations or if we need to destroy the element and stuff. If there is no ID at the server, the server will update the sended informations of the client and send all the informations to each other player on the server, who is in range the ped. (virutal ped, since the position is server-sided) This is the first step of preventing the server using too much bandwidth/stress. When the server sends the data to each client.. the clients need to check if the ID of the ped exists on their client.. if not, create the ped and store the informations send by the server to the ped-object class. Also check if the ped you've created is client-side or server-side. Since we dont need the data of your own peds the client-side has been created.
</p>

<p>
	So to put everything together:
</p>

<p>
	Your client creates peds.. they're local. You just stream the information of your OWN peds to the server.. while this happens.. the server send the information of other player peds to you. If you dont got the ped with the unique ID created.. you need to create the ped and update the informations you've got.. so let the ped wak to xyz.. update models,.. health...
</p>

<p>
	 
</p>

<p>
	I hope with this non-spoonfeed tutorial i helped you a bit.. Ask question if you want.. Thank you! <span>:) </span>
</p>
]]></description><guid isPermaLink="false">4806</guid><pubDate>Wed, 03 Jul 2019 10:15:56 +0000</pubDate></item><item><title>[Tutorial] Install server RageMP (Centos 7)</title><link>https://rage.mp/forums/topic/1596-tutorial-install-server-ragemp-centos-7/</link><description><![CDATA[
<p>
	<em><strong>Hello,</strong></em>
</p>

<p>
	<em><strong>I would like to show you how to properly install the RageMP server on the Centos 7 linux distribution.</strong></em>
</p>

<p>
	<em><strong>Table of Contents:</strong></em>
</p>

<ol><li>
		<em>System update</em>
	</li>
	<li>
		<em>Package installation</em>
	</li>
	<li>
		<em>Building GCC 7.3.0</em>
	</li>
	<li>
		<em>Adding a user</em>
	</li>
	<li>
		<em>Server installation</em>
	</li>
	<li>
		<em>Starting the server</em>
	</li>
</ol><p>
	<strong><em>Informations:</em></strong>
</p>

<ul><li>
		<em>Yum - Package manager in the RHel system</em>
	</li>
	<li>
		<em>Update - Argument to yum</em>
	</li>
	<li>
		<em>Install - Argument to yum</em>
	</li>
	<li>
		<em>-y - skipping accepting installation</em>
	</li>
	<li>
		<em>Screen - Allows you to run processes in the background</em>
	</li>
</ul><p style="text-align:center;">
	<span style="color:#c0392b;"><em><strong>Warning!</strong></em></span>
</p>

<p style="text-align:center;">
	<span style="color:#c0392b;"><em><strong>Change USERNAME to your username!</strong></em></span>
</p>

<p>
	<strong><em>1. System update</em></strong>
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="pln">yum update -y;</span></pre>

<p>
	 
</p>

<p>
	<em><strong>2. Package installation</strong></em>
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="pln">yum install epel-release -y; yum install nano zip unzip libunwind libunwind-devel libicu libicu-devel nodejs npm screen psmisc curl wget gmp-devel mpfr-devel libmpc-devel; yum groupinstall 'Development Tools';</span></pre>

<p>
	 
</p>

<p>
	<strong><em>3. Building GCC (7.3.0) - The process takes about 1H or 2H depends on what server you have.</em></strong>
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="pln">cd /root; wget https://ftp.gnu.org/gnu/gcc/gcc-7.3.0/gcc-7.3.0.tar.gz; tar -xf gcc-7.3.0.tar.gz; mkdir gcc-build; cd gcc-build; ../gcc-7.3.0/configure --enable-languages=c,c++ --disable-multilib --prefix=/usr/ ; make -j$(nproc); make install;</span></pre>

<p>
	 
</p>

<p>
	<strong><em>4. Adding a user</em></strong>
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="pln">adduser USERNAME</span></pre>

<p>
	<em>Setting the password</em>
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="pln">passwd USERNAME</span></pre>

<p>
	 
</p>

<p>
	<strong><em>5. Server installation</em></strong>
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="pln">su - USERNAME</span></pre>

<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="pln">wget https://cdn.rage.mp/lin/ragemp-srv.tar.gz; tar -xf ragemp-srv.tar.gz; cd ragemp-srv; mv * ../; cd ../; rm -rf ragemp-srv; wget https://cdn.gtanet.work/bridge-package-linux.tar.gz; tar -xf bridge-package-linux.tar.gz; rm -rf *.tar.gz</span></pre>

<p>
	 
</p>

<p>
	<strong><em>6. Starting the server</em></strong>
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="pln">screen -dmS serwer ./server</span></pre>

<p>
	<em>Going to the console</em>
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="pln">screen -r serwer</span></pre>

<p>
	 
</p>

<p>
	<u><em><strong>Original Polish Tutorial: </strong></em></u>
</p>
<iframe allowfullscreen="" data-controller="core.front.core.autosizeiframe" data-embedcontent="" data-embedid="embed5242622208" scrolling="no" src="https://rage.mp/forums/topic/1595-poradnik-instalacja-serwera-ragemp-centos-7/?tab=comments&amp;do=embed&amp;comment=6792&amp;embedComment=6792&amp;embedDo=findComment#comment-6792" style="height:243px;max-width:502px;"></iframe>

<p>
	 
</p>

<p style="text-align:right;">
	<span style="color:#c0392b;"><strong><em>2018 © Matix8981 All rights reserved</em></strong></span>
</p>

<p style="text-align:right;">
	 
</p>
]]></description><guid isPermaLink="false">1596</guid><pubDate>Tue, 08 May 2018 07:19:40 +0000</pubDate></item><item><title>Let players spawn again</title><link>https://rage.mp/forums/topic/4725-let-players-spawn-again/</link><description><![CDATA[
<p>
	Hello,
</p>

<p>
	I would like that when a player is lying dead on the ground he can let himself be re-spawned with a comman. But unfortunately does not know how to go.
</p>

<p>
	I would be very happy if someone could provide a solution in js.
</p>

<p>
	Yours sincerely
</p>

<p>
	Fabian
</p>
]]></description><guid isPermaLink="false">4725</guid><pubDate>Sun, 23 Jun 2019 17:00:13 +0000</pubDate></item><item><title>C# getting started + debugging</title><link>https://rage.mp/forums/topic/1807-c-getting-started-debugging/</link><description><![CDATA[
<p>
	I wanted to make a tutorial that is a little different from what is currently offered on the wiki (<a href="https://wiki.gtanet.work/index.php?title=Setting_Up_a_Development_Environment_using_Visual_Studio" rel="external nofollow">https://wiki.gtanet.work/index.php?title=Setting_Up_a_Development_Environment_using_Visual_Studio</a>)
</p>

<p>
	This tutorial gets y<span style="font-size:14px;">ou throug</span>h <span style="font-size:14px;">setting u</span>p a project outside the RAGE MP folder, that automatically builds into a resource folder, and allows debugging by simply pressing "Run" or F5 in Visual Studio 2017
</p>

<p>
	There's a download of a project set up this way in the bottom of the post, if you just want to get started as fast as possible. You'll need to change all the paths in the configured project obviously, but there you go.
</p>

<p>
	<strong><span style="font-size:18px;">Prerequisites</span></strong>
</p>

<ul><li>
		<span style="font-size:14px;">Visual Studio 2017 (At the time of writing, using version 15.7.1)</span>
	</li>
	<li>
		RAGE MP installed and server <a href="https://wiki.rage.mp/index.php?title=Getting_Started_with_Server" rel="">set up</a>.
	</li>
	<li>
		Common sense
	</li>
</ul><p>
	 
</p>

<p>
	<span style="font-size:18px;"><strong>Setup</strong></span>
</p>

<p>
	Ensure the  <strong>.NET Core cross-platform development </strong>package/product is installed.
</p>

<ol><li>
		Open <strong>Visual Studio Installer</strong> from the start menu<br /><img alt="ZK2W2FL.png" class="ipsImage" height="64" src="https://i.imgur.com/ZK2W2FL.png" width="344" /></li>
	<li>
		Click on modify under Visual Studio {Version} 2017<br /><img alt="Ir8wHVp.png" class="ipsImage" height="264" src="https://i.imgur.com/Ir8wHVp.png" width="317" /></li>
	<li>
		Find <strong>.NET Core cross-platform development</strong> and make sure it's checked<br /><img alt="jopeHxK.png" class="ipsImage" height="123" src="https://i.imgur.com/jopeHxK.png" width="422" /></li>
	<li>
		If it wasn't installed previously, after checking the box on this item, click modify in the bottom right, and install the package.
	</li>
</ol><p>
	 
</p>

<p>
	<span style="font-size:18px;"><strong>Creating the project</strong></span>
</p>

<ol><li>
		<span style="font-size:14px;">Open Visual Studio, and click <strong>File -&gt; New -&gt; Project</strong>.</span>
	</li>
	<li>
		<span style="font-size:14px;">In the tree on the left, go to <strong>Installed -&gt; Visual C# -&gt; .NET Core</strong>. Then select <strong>Class Library (.NET Core)</strong> in the list on the right.<br />
		Give your project a name in the bottom, choose a location to store it (can be anywhere on your PC), and hit <strong>OK</strong><br /><img alt="CZhI5g9.png" class="ipsImage" height="443" src="https://i.imgur.com/CZhI5g9.png" width="786" /></span>
	</li>
	<li>
		<span style="font-size:14px;">This should create a project that compiles as <strong>.NET Core 2.0</strong>, which is the version used for resources at the time of writing. It may change to 2.1 in version 0.4 of </span>RAGE MP<span style="font-size:14px;">. To ensure the project compiles to Core 2.0, right click on your new project in the <strong>Solution Explorer</strong>, and select <strong>Properties</strong>.<br />
		Under <strong>Target framework</strong>, ensure it says <strong>.NET Core 2.0</strong><br /><img alt="uWWGNdg.png" class="ipsImage" height="156" src="https://i.imgur.com/uWWGNdg.png" width="311" /></span>
	</li>
	<li>
		<span style="font-size:14px;">While we're here, we can configure debugging. On the left, select the <strong>Debug</strong> tab, change the <strong>Launch</strong> dropdown to <strong>Executable</strong>.<br />
		A new item appears: <strong>Executable</strong> with a <strong>Browse...</strong> button. Click browse, and select your </span>RAGE MP <span style="font-size:14px;">server.exe<br />
		The second input below that is for <strong>Working directory</strong>, set that to the folder that contains server.exe<br /><img alt="UnMW21T.png" class="ipsImage" height="299" src="https://i.imgur.com/UnMW21T.png" width="743" /></span>
	</li>
	<li>
		<span style="font-size:14px;">Save this window and close it.</span>
	</li>
</ol><p>
	 
</p>

<p>
	<span style="font-size:18px;"><strong>Build configuration</strong></span>
</p>

<p>
	<span style="font-size:14px;">Now we need to change how the project is built. If you want use external NuGet packages, you'll want Visual Studio to copy their DLLs to the build directory.</span>
</p>

<ol><li>
		<span style="font-size:14px;">Right click on your project in the <strong>Solution Explorer</strong>, and click <strong>Edit {project name}.csproj</strong><br /><img alt="zxuCU21.png" class="ipsImage" height="212" src="https://i.imgur.com/zxuCU21.png" width="292" /></span>
	</li>
	<li>
		Under 
		<pre class="ipsCode prettyprint lang-xml prettyprinted">
<span class="tag">&lt;TargetFramework&gt;</span><span class="pln">netcoreapp2.0</span><span class="tag">&lt;/TargetFramework&gt;</span></pre>

		<p>
			Add the following:<br />
			 
		</p>

		<pre class="ipsCode prettyprint lang-xml prettyprinted">
<span class="tag">&lt;CopyLocalLockFileAssemblies&gt;</span><span class="pln">true</span><span class="tag">&lt;/CopyLocalLockFileAssemblies&gt;</span></pre>

		<p>
			<img alt="8BcgXiD.png" class="ipsImage" height="98" src="https://i.imgur.com/8BcgXiD.png" width="514" /></p>
	</li>
	<li>
		<p>
			Save and close the file.
		</p>
	</li>
</ol><p>
	Now we set up the Meta.xml file.
</p>

<ol><li>
		Right click on your project, and select <strong>Add -&gt; New Item...</strong>
	</li>
	<li>
		In the pop-up dialog, click on <strong>Installed -&gt; Visual C# Items</strong> in the tree on the left, then scroll down and select <strong>Xml File</strong> in the list on the right, and name it <b>meta.xml</b><br /><img alt="jWJjFeU.png" class="ipsImage" height="443" src="https://i.imgur.com/jWJjFeU.png" width="786" /></li>
	<li>
		Replace the file contents with the following, replacing <strong>ExampleResource</strong> with the name of your project:
		<pre class="ipsCode prettyprint lang-xml prettyprinted">
<span class="tag">&lt;meta&gt;</span><span class="pln">
	</span><span class="tag">&lt;info</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"ExampleResource"</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"script"</span><span class="pln"> </span><span class="tag">/&gt;</span><span class="pln">
	</span><span class="tag">&lt;script</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">"ExampleResource.dll"</span><span class="pln"> </span><span class="tag">/&gt;</span><span class="pln">
</span><span class="tag">&lt;/meta&gt;</span></pre>
	</li>
	<li>
		Save and close the file.
	</li>
	<li>
		Right click on the file in <strong>Solution Explorer</strong> and click <strong>Properties</strong>
	</li>
	<li>
		Set <strong>Build Action</strong> to <strong>Content</strong> and <strong>Copy to Output Directory</strong> to <strong>Copy always</strong><br /><img alt="TuJAJmu.png" class="ipsImage" height="63" src="https://i.imgur.com/TuJAJmu.png" width="619" /></li>
</ol><p>
	Now let's configure it to copy the built project to the resources directory.
</p>

<ol><li>
		Go back to the project properties (<strong>Solution Explorer</strong>, right click on the project, <strong>Properties</strong>).
	</li>
	<li>
		Open the <strong>Build Events</strong> tab, and put the following code in the text box under <strong>Post-build event command line</strong>:
		<pre class="ipsCode">
del "D:\Games\RAGEMP\server-files\bridge\resources\ExampleResource\*.*" /Q
xcopy "$(OutDir)*" "D:\Games\RAGEMP\server-files\bridge\resources\ExampleResource" /Y</pre>

		<p>
			Make sure to replace the path to <strong>\bridge\resources</strong> and <strong>ExampleResource</strong> with the correct path to the resources, and your project name. Also make sure the folder exists, obviously.<br /><img alt="mol6zoL.png" class="ipsImage" height="90" src="https://i.imgur.com/mol6zoL.png" width="623" /></p>
	</li>
	<li>
		Save and close the properties window.
	</li>
</ol><p>
	Try going to <strong>Build</strong> -&gt; <strong>Rebuild Solution</strong> in the top of Visual Studio. This should complete successfully, and several DLLs should now appear in the resource folder in your server installation.
</p>

<p>
	 
</p>

<p>
	<span style="font-size:18px;"><strong>Add the resource to the server settings.xml</strong></span>
</p>

<ol><li>
		<span style="font-size:14px;">Open the <strong>settings.xml</strong> file in the </span>RAGE MP<span style="font-size:14px;"> server directory under the <strong>bridge</strong> folder</span>
	</li>
	<li>
		<span style="font-size:14px;">Add the following, replacing <strong>ExampleResource</strong> with the name of your resource</span>
		<pre class="ipsCode prettyprint lang-xml prettyprinted">
<span class="tag">&lt;resource</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">"ExampleResource"</span><span class="pln"> </span><span class="tag">/&gt;</span></pre>
		<img alt="SstPReh.png" class="ipsImage" height="142" src="https://i.imgur.com/SstPReh.png" width="336" /></li>
	<li>
		Save and close the file.
	</li>
</ol><p>
	 
</p>

<p>
	<span style="font-size:18px;"><strong>Creating the resource</strong></span>
</p>

<p>
	<span style="font-size:14px;">Alright, that should be the basic project and debugging configured. Now let's add the GTA Network package so we can create a resource.</span>
</p>

<ol><li>
		In the <strong>Solution Explorer</strong>, right click on your project and select <strong>Manage NuGet packages...</strong><br /><img alt="6t9Tynu.png" class="ipsImage" height="275" src="https://i.imgur.com/6t9Tynu.png" width="325" /></li>
	<li>
		Click on <strong>Browse</strong> in the top left, search for <strong>gtanetwork.api</strong>, and install the <strong>gtanetwork.api</strong> package.<br /><img alt="0yja7aR.png" class="ipsImage" height="200" src="https://i.imgur.com/0yja7aR.png" width="868" /></li>
	<li>
		By default, there should be a <strong>Class1.cs</strong> with a class in it called <strong>Class1</strong>. I like to rename this to <strong>Main.cs</strong> with a class <strong>Main</strong>, I suggest you do the same as I'll be referring to it in the rest of the tutorial.
	</li>
	<li>
		Replace the content of the file with the following. I will not be explaining basic C#, but it'll demonstrate the project working, and give you an entry point for the code:
		<pre class="ipsCode prettyprint lang-c prettyprinted">
<span class="kwd">using</span><span class="pln"> </span><span>System</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">using</span><span class="pln"> </span><span>GTANetworkAPI</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">namespace</span><span class="pln"> </span><span>ExampleResource</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
	</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span>Main</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span>Script</span><span class="pln">
	</span><span class="pun">{</span><span class="pln">
		</span><span class="pun">[</span><span>ServerEvent</span><span class="pun">(</span><span>Event</span><span class="pun">.</span><span>ResourceStart</span><span class="pun">)]</span><span class="pln">
		</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span>OnResourceStart</span><span class="pun">()</span><span class="pln">
		</span><span class="pun">{</span><span class="pln">
			NAPI</span><span class="pun">.</span><span>Util</span><span class="pun">.</span><span>ConsoleOutput</span><span class="pun">(</span><span class="str">"Example resource loaded!"</span><span class="pun">);</span><span class="pln">
		</span><span class="pun">}</span><span class="pln">
	</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		Save the file, and <span style="color:#e74c3c;"><span style="font-size:18px;"><strong>HIT THAT MF DEBUG BUTTON</strong></span></span> in the top of Visual Studio <img alt="xLl2vzq.png" class="ipsImage" height="27" src="https://i.imgur.com/xLl2vzq.png" width="134" /></li>
</ol><p>
	The server should now start up and show our console output:
</p>

<p>
	<img alt="YKSidaP.png" class="ipsImage" height="114" src="https://i.imgur.com/YKSidaP.png" width="516" /></p>

<p>
	 
</p>

<p>
	<span style="font-size:18px;"><strong>Breakpoints</strong></span>
</p>

<p>
	<span style="font-size:14px;">Breakpoints should also work immediately, try placing one on the console output, and hit debug:</span>
</p>

<p>
	<span style="font-size:14px;"><img alt="rNteXru.png" class="ipsImage" height="129" src="https://i.imgur.com/rNteXru.png" width="425" /></span>
</p>

<p>
	 
</p>

<p>
	If something still doesn't work, you can download an example project <a href="https://1drv.ms/u/s!AvUNBP9oO_ZAnLUwS-8Ehnn2BXB1_Q" rel="external nofollow">here</a>, which was set up using the steps above. Obviously you'll need to change the paths configured in it to match your system, but it may help you debug any issues.
</p>
]]></description><guid isPermaLink="false">1807</guid><pubDate>Fri, 22 Jun 2018 16:49:45 +0000</pubDate></item><item><title>PM System</title><link>https://rage.mp/forums/topic/4506-pm-system/</link><description><![CDATA[<p>
	<span style="background-color:#ffffff;color:#3c4043;font-size:small;">What kind of coding do I need for the PM system?</span>
</p>]]></description><guid isPermaLink="false">4506</guid><pubDate>Tue, 04 Jun 2019 05:29:16 +0000</pubDate></item><item><title>Mapping</title><link>https://rage.mp/forums/topic/4283-mapping/</link><description><![CDATA[<p>
	Hi ich möchte fragen ob mir wer helfen kann wie das mit dem mapping geht?
</p>]]></description><guid isPermaLink="false">4283</guid><pubDate>Sat, 11 May 2019 18:17:39 +0000</pubDate></item><item><title>[Tutorial] Simple WebMap</title><link>https://rage.mp/forums/topic/4282-tutorial-simple-webmap/</link><description><![CDATA[
<p>
	Hello everyone! In this tutorial I will try to show you how to create a Web map of your server.
</p>

<p style="text-align:center;">
	<strong>Stage 0 - Some usefull stuff</strong>
</p>

<p>
	We need to walk around GTA map, so lets create a resource to make it easier:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="pln">
mp.events.addCommand('veh', (player, veh)=&gt; {
	mp.vehicles.new(veh, player.position)
}) // Create a vehicle 
mp.events.addCommand('tp', (player, _, x, y, z)=&gt; {
	player.giveWeapon(0xFBAB5776, 2) // Parachute, you need this, trust me
	player.position = new mp.Vector3(parseInt(x), parseInt(y), parseInt(z))
}) // Teleport a player
mp.events.addCommand('pos', (player)=&gt;{
	console.log(player.position.x + ' ' + player.position.y + ' ' + player.position.z)
}) // Get player coords at write it to console</span></pre>

<p style="text-align:center;">
	<strong>Stage 1 - Frontend</strong>
</p>

<p>
	Step 1:  <strong>Get a map image</strong>, you can find some good images here: 
</p>

<p>
	<a href="https://gtaforums.com/topic/595113-high-resolution-maps-satellite-roadmap-atlas/" rel="external nofollow">https://gtaforums.com/topic/595113-high-resolution-maps-satellite-roadmap-atlas/</a>
</p>

<p>
	I will use 4096*4096 satellite map.
</p>

<p>
	<a href="http://blog.damonpollard.com/wp-content/uploads/2013/09/GTAV_SATELLITE_4096x4096.png" rel="external nofollow">http://blog.damonpollard.com/wp-content/uploads/2013/09/GTAV_SATELLITE_4096x4096.png</a>
</p>

<p>
	Step 2: <strong>Create a html file for our map: </strong>
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="tag">&lt;img</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">'http://blog.damonpollard.com/wp-content/uploads/2013/09/GTAV_SATELLITE_4096x4096.png'</span><span class="pln"> </span><span class="atn">style</span><span class="pun">=</span><span class="atv">"</span><span class="kwd">position</span><span class="pun">:</span><span class="pln"> absolute</span><span class="atv">"</span><span class="tag">&gt;</span><span class="pln">
</span><span class="tag">&lt;canvas</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">'map'</span><span class="pln"> </span><span class="atn">style</span><span class="pun">=</span><span class="atv">'</span><span class="kwd">height</span><span class="pun">:</span><span class="pln"> </span><span class="lit">4096px</span><span class="pun">;</span><span class="pln"> </span><span class="kwd">width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">4096px</span><span class="pun">;</span><span class="pln"> </span><span class="kwd">position</span><span class="pun">:</span><span class="pln"> absolute</span><span class="pun">;</span><span class="pln"> </span><span class="kwd">z-index</span><span class="pun">:</span><span class="pln"> </span><span class="lit">9999</span><span class="atv">'</span><span class="tag">&gt;</span></pre>

<p>
	This code adds a picture and then puts a canvas over it, so we can draw above our map.
</p>

<p>
	Step 3: <strong>Lets make some calculations</strong>
</p>

<p>
	0) First of all, install commands from Stage 0 to your gamemode and then connect to your server.
</p>

<p>
	1) Open your map picture with Paint
</p>

<p>
	2) Determine zero point
</p>

<p>
	Teleport to (0, 0, 72) position and determine this location at your map inside paint (put pointer on it), write down coordinates 
</p>

<p>
	<img alt="rUnPR6g.png" class="ipsImage" height="529" src="https://i.imgur.com/rUnPR6g.png" width="1003" /></p>

<p>
	3) Determine map scale
</p>

<p>
	Choose two points at map. I will use the most northen island and LS Aiport
</p>

<p>
	<img alt="WtPB1TS.png" class="ipsImage" height="354" src="https://i.imgur.com/WtPB1TS.png" width="584" /></p>

<p>
	<img alt="8LNc5h3.png" class="ipsImage" height="353" src="https://i.imgur.com/8LNc5h3.png" width="543" /></p>

<p>
	Write down 'paint' coordinates for both.
</p>

<p>
	It is (1889, 232) (1570, 3939) for me (if you use map with another size, you will get different numbers). 
</p>

<p>
	Calculate range between this coords, it is 3720.7002 for me.
</p>

<p>
	Then go to GTA and walk to both points
</p>

<p>
	<img alt="ImXUTtF.jpg" class="ipsImage" height="669" src="https://i.imgur.com/ImXUTtF.jpg" width="1200" /></p>

<p>
	Write /pos to output your position to console
</p>

<p>
	34.01333999633789 7689.458984375 2.8789443969726562 - northen island
</p>

<p>
	-933.9918823242188 -3570.4599609375 14.037487030029297 - airport corner
</p>

<p>
	Then calculate distance between this points only with x and y axis.
</p>

<p>
	Result: 11301.451622046046 (meters)
</p>

<p>
	Now lets finally get map scale: for me it is 11301.451622046046 (meters) / 3720.7 (pixels) = <span style="background-color:#ffffff;color:#1c00cf;font-size:12px;">3.037861303705727 (meters per pixel)</span>
</p>

<p>
	<span style="color:#000000;"><span style="background-color:rgb(255,255,255);">4) Determine axises</span></span>
</p>

<p>
	<span style="color:#000000;"><span style="background-color:rgb(255,255,255);">Red is world coords, green - picture/html coords</span></span>
</p>

<p>
	<img alt="HqIfzwi.png" class="ipsImage" height="839" src="https://i.imgur.com/HqIfzwi.png" width="837" /></p>

<p>
	 
</p>

<p>
	Step 4: <strong>Lets start with a code</strong>
</p>

<p>
	First of all, we need a function that converts world coordinates to picture coordinates.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted">
<span class="kwd">const</span><span class="pln"> </span><span>ZeroX</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1903</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> </span><span>ZeroY</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">2690</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> </span><span>Scale</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">3.037861303705727</span><span class="pln">
function getPictureCoords</span><span class="pun">(</span><span class="pln">x</span><span class="pun">,</span><span class="pln"> y</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  x </span><span class="pun">=</span><span class="pln"> x</span><span class="pun">/</span><span>Scale</span><span class="pln">
  y </span><span class="pun">=</span><span class="pln"> y</span><span class="pun">/</span><span>Scale</span><span class="pln">
  </span><span class="kwd">return</span><span class="pln"> </span><span class="pun">{</span><span class="pln">x</span><span class="pun">:</span><span class="pln"> </span><span>ZeroX</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> x </span><span class="pun">,</span><span class="pln"> y</span><span class="pun">:</span><span class="pln"> </span><span>ZeroY</span><span class="pln"> </span><span class="pun">-</span><span class="pln"> y</span><span class="pun">}</span><span class="pln"> </span><span class="com">// Invert Y-axis</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	You can test it by teleporting to random coords and then finding that place in paint
</p>

<p>
	Now it's time to start drawing.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="pln">const ctx = document.getElementById('map').getContext('2d')</span></pre>

<p>
	Lets make a function that draws a player marker (red circle and a name above it)
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted">
<span class="kwd">function</span><span class="pln"> drawPlayerMarker</span><span class="pun">(</span><span class="pln">x</span><span class="pun">,</span><span class="pln"> y</span><span class="pun">,</span><span class="pln"> name</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
	newCoords </span><span class="pun">=</span><span class="pln"> getPictureCoords</span><span class="pun">(</span><span class="pln">x</span><span class="pun">,</span><span class="pln"> y</span><span class="pun">)</span><span class="pln">
	x </span><span class="pun">=</span><span class="pln"> newCoords</span><span class="pun">.</span><span class="pln">x
	y </span><span class="pun">=</span><span class="pln"> newCoords</span><span class="pun">.</span><span class="pln">y
	ctx</span><span class="pun">.</span><span class="pln">fillStyle </span><span class="pun">=</span><span class="pln"> </span><span class="str">'red'</span><span class="pln">
	ctx</span><span class="pun">.</span><span class="pln">beginPath</span><span class="pun">()</span><span class="pln">
	ctx</span><span class="pun">.</span><span class="pln">arc</span><span class="pun">(</span><span class="pln">x</span><span class="pun">,</span><span class="pln"> y</span><span class="pun">,</span><span class="pln"> </span><span class="lit">5</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span>Math</span><span class="pun">.</span><span class="pln">PI</span><span class="pun">)</span><span class="pln">
	ctx</span><span class="pun">.</span><span class="pln">fill</span><span class="pun">()</span><span class="pln">
	ctx</span><span class="pun">.</span><span class="pln">font </span><span class="pun">=</span><span class="pln"> </span><span class="str">"25px Arial"</span><span class="pun">;</span><span class="pln">
	ctx</span><span class="pun">.</span><span class="pln">fillText</span><span class="pun">(</span><span class="pln">name</span><span class="pun">,</span><span class="pln"> x </span><span class="pun">-</span><span class="pln"> </span><span class="lit">15</span><span class="pun">,</span><span class="pln"> y </span><span class="pun">-</span><span class="pln"> </span><span class="lit">15</span><span class="pun">)</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	Lets test it!
</p>

<p>
	<img alt="mVPjXqD.jpg" class="ipsImage" height="627" src="https://i.imgur.com/mVPjXqD.jpg" width="1200" /></p>

<p>
	It works!
</p>

<p style="text-align:center;">
	<strong>Stage 2 - Backend</strong>
</p>

<p>
	We will use socket.io to communicate between browser and server.
</p>

<p>
	Step 0: Install express and socket.io packages.
</p>

<p>
	Run windows command line -&gt; change directory to your /server-files directory -&gt; run npm install express npm install socket.io 
</p>

<p>
	Step 1: Create express app
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted">
<span class="com">//load map.html and socket.io</span><span class="pln">
</span><span class="kwd">var</span><span class="pln"> fs </span><span class="pun">=</span><span class="pln"> require</span><span class="pun">(</span><span class="str">'fs'</span><span class="pun">)</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> port </span><span class="pun">=</span><span class="pln"> </span><span class="lit">3000</span><span class="pln">
</span><span class="kwd">var</span><span class="pln"> mapHTML </span><span class="pun">=</span><span class="pln"> fs</span><span class="pun">.</span><span class="pln">readFileSync</span><span class="pun">(</span><span class="str">"./webmap/map.html"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"utf8"</span><span class="pun">)</span><span class="pln">
</span><span class="kwd">var</span><span class="pln"> socketIO </span><span class="pun">=</span><span class="pln"> fs</span><span class="pun">.</span><span class="pln">readFileSync</span><span class="pun">(</span><span class="str">"./webmap/socket.io.js"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"utf8"</span><span class="pun">)</span><span class="pln">
</span><span class="com">//create app</span><span class="pln">
</span><span class="kwd">var</span><span class="pln"> app </span><span class="pun">=</span><span class="pln"> require</span><span class="pun">(</span><span class="str">'express'</span><span class="pun">)();</span><span class="pln">
</span><span class="kwd">var</span><span class="pln"> http </span><span class="pun">=</span><span class="pln"> require</span><span class="pun">(</span><span class="str">'http'</span><span class="pun">).</span><span>Server</span><span class="pun">(</span><span class="pln">app</span><span class="pun">);</span><span class="pln">
</span><span class="kwd">var</span><span class="pln"> io </span><span class="pun">=</span><span class="pln"> require</span><span class="pun">(</span><span class="str">'socket.io'</span><span class="pun">)(</span><span class="pln">http</span><span class="pun">);</span><span class="pln">
</span><span class="com">//listen 3000 port</span><span class="pln">
http</span><span class="pun">.</span><span class="pln">listen</span><span class="pun">(</span><span class="lit">3000</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">function</span><span class="pun">(){</span><span class="pln">
  console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="str">'webMap is active at 3000 port!'</span><span class="pun">);</span><span class="pln">
</span><span class="pun">});</span><span class="pln">
</span><span class="com">//send map.html and socket.io to every client</span><span class="pln">
app</span><span class="pun">.</span><span class="kwd">get</span><span class="pun">(</span><span class="str">'/'</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> </span><span class="pun">(</span><span class="pln">req</span><span class="pun">,</span><span class="pln"> res</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  res</span><span class="pun">.</span><span class="pln">send</span><span class="pun">(</span><span class="pln">mapHTML</span><span class="pun">);</span><span class="pln">
</span><span class="pun">});</span><span class="pln">
app</span><span class="pun">.</span><span class="kwd">get</span><span class="pun">(</span><span class="str">'/socket.io.js'</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> </span><span class="pun">(</span><span class="pln">req</span><span class="pun">,</span><span class="pln"> res</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  res</span><span class="pun">.</span><span class="pln">send</span><span class="pun">(</span><span class="pln">socketIO</span><span class="pun">);</span><span class="pln">
</span><span class="pun">})</span></pre>

<p>
	Put your map.html file to /server-files/webmap folder
</p>

<p>
	Then go to \server-files\node_modules\socket.io-client\dist, find <strong>socket.io.js</strong> file and put it to server-files/webmap folder
</p>

<p>
	Step 2: Prepare and send data to client
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted">
<span class="kwd">function</span><span class="pln"> prepareAndSendPlayersData</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
	</span><span class="kwd">var</span><span class="pln"> toSend </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[]</span><span class="pln">
	mp</span><span class="pun">.</span><span class="pln">players</span><span class="pun">.</span><span class="pln">forEach</span><span class="pun">((</span><span class="pln">player</span><span class="pun">)=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
		toSend</span><span class="pun">.</span><span class="pln">push</span><span class="pun">({</span><span class="pln">
			x</span><span class="pun">:</span><span class="pln"> player</span><span class="pun">.</span><span class="pln">position</span><span class="pun">.</span><span class="pln">x</span><span class="pun">,</span><span class="pln">
			y</span><span class="pun">:</span><span class="pln"> player</span><span class="pun">.</span><span class="pln">position</span><span class="pun">.</span><span class="pln">y</span><span class="pun">,</span><span class="pln">
			name</span><span class="pun">:</span><span class="pln"> player</span><span class="pun">.</span><span class="pln">name
		</span><span class="pun">})</span><span class="pln">
	</span><span class="pun">})</span><span class="pln">
	sendPlayersData</span><span class="pun">(</span><span class="pln">toSend</span><span class="pun">)</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">function</span><span class="pln"> sendPlayersData</span><span class="pun">(</span><span class="pln">data</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
	io</span><span class="pun">.</span><span class="pln">sockets</span><span class="pun">.</span><span class="pln">emit</span><span class="pun">(</span><span class="str">'playersData'</span><span class="pun">,</span><span class="pln"> data</span><span class="pun">)</span><span class="pln"> </span><span class="com">// Send our data to every client</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	Step 3: Create interval
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted">
<span class="pln">setInterval</span><span class="pun">(</span><span class="pln">prepareAndSendPlayersData</span><span class="pun">,</span><span class="pln"> </span><span class="lit">200</span><span class="pun">)</span><span class="pln"> </span><span class="com">// Update every 200 ms</span></pre>

<p style="text-align:center;">
	 <strong>Stage 3 - Receiving data on client</strong>
</p>

<p>
	Step 1: Add socket.io script to your html file
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="tag">&lt;script</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">"/socket.io.js"</span><span class="tag">&gt;&lt;/script&gt;</span></pre>

<p>
	Step 2: Add variable and event to handle data
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted">
<span class="kwd">var</span><span class="pln"> playersData </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[]</span><span class="pln">

</span><span class="kwd">var</span><span class="pln"> socket </span><span class="pun">=</span><span class="pln"> io</span><span class="pun">(</span><span class="str">'localhost:3000'</span><span class="pun">)</span><span class="pln"> </span><span class="com">// Your server ip here</span><span class="pln">

socket</span><span class="pun">.</span><span class="pln">on</span><span class="pun">(</span><span class="str">'playersData'</span><span class="pun">,</span><span class="pln"> </span><span class="pun">(</span><span class="pln">data</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
	playersData </span><span class="pun">=</span><span class="pln"> data
	redraw</span><span class="pun">()</span><span class="pln">
</span><span class="pun">})</span></pre>

<p>
	Step 3: Redraw map with new data
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="pln">function redraw() {
	ctx.clearRect(0, 0, 4096, 4096);
	playersData.forEach((player)=&gt; {
		drawPlayerMarker(player.x, player.y, player.name)
})</span></pre>

<p style="text-align:center;">
	Thats all! You can run your server, then open browser and go to youserverip:3000 and test it.
</p>

<p style="text-align:center;">
	<img alt="HjVgqHf.jpg" class="ipsImage" height="666" src="https://i.imgur.com/HjVgqHf.jpg" width="1200" /></p>

<p style="text-align:center;">
	map.js (server package)
</p>

<div class="ipsSpoiler" data-ipsspoiler="">
	<div class="ipsSpoiler_header">
		<span>Скрытый текст</span>
	</div>

	<div class="ipsSpoiler_contents">
		<pre class="ipsCode prettyprint lang-javascript prettyprinted">

<span class="com">//load map.html</span><span class="pln">
</span><span class="kwd">var</span><span class="pln"> fs </span><span class="pun">=</span><span class="pln"> require</span><span class="pun">(</span><span class="str">'fs'</span><span class="pun">)</span><span class="pln">
</span><span class="kwd">var</span><span class="pln"> mapHTML </span><span class="pun">=</span><span class="pln"> fs</span><span class="pun">.</span><span class="pln">readFileSync</span><span class="pun">(</span><span class="str">"./webmap/map.html"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"utf8"</span><span class="pun">)</span><span class="pln">
</span><span class="kwd">var</span><span class="pln"> socketIO </span><span class="pun">=</span><span class="pln"> fs</span><span class="pun">.</span><span class="pln">readFileSync</span><span class="pun">(</span><span class="str">"./webmap/socket.io.js"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"utf8"</span><span class="pun">)</span><span class="pln">

</span><span class="com">//create app</span><span class="pln">
</span><span class="kwd">var</span><span class="pln"> app </span><span class="pun">=</span><span class="pln"> require</span><span class="pun">(</span><span class="str">'express'</span><span class="pun">)();</span><span class="pln">
</span><span class="kwd">var</span><span class="pln"> http </span><span class="pun">=</span><span class="pln"> require</span><span class="pun">(</span><span class="str">'http'</span><span class="pun">).</span><span>Server</span><span class="pun">(</span><span class="pln">app</span><span class="pun">);</span><span class="pln">
</span><span class="kwd">var</span><span class="pln"> io </span><span class="pun">=</span><span class="pln"> require</span><span class="pun">(</span><span class="str">'socket.io'</span><span class="pun">)(</span><span class="pln">http</span><span class="pun">);</span><span class="pln">
</span><span class="com">//send map.html to every client</span><span class="pln">
app</span><span class="pun">.</span><span class="kwd">get</span><span class="pun">(</span><span class="str">'/'</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> </span><span class="pun">(</span><span class="pln">req</span><span class="pun">,</span><span class="pln"> res</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  res</span><span class="pun">.</span><span class="pln">send</span><span class="pun">(</span><span class="pln">mapHTML</span><span class="pun">);</span><span class="pln">
</span><span class="pun">});</span><span class="pln">
app</span><span class="pun">.</span><span class="kwd">get</span><span class="pun">(</span><span class="str">'/socket.io.js'</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> </span><span class="pun">(</span><span class="pln">req</span><span class="pun">,</span><span class="pln"> res</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  res</span><span class="pun">.</span><span class="pln">send</span><span class="pun">(</span><span class="pln">socketIO</span><span class="pun">);</span><span class="pln">
</span><span class="pun">})</span><span class="pln">

http</span><span class="pun">.</span><span class="pln">listen</span><span class="pun">(</span><span class="lit">3000</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">function</span><span class="pun">(){</span><span class="pln">
  console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="str">'listening on *:3000'</span><span class="pun">);</span><span class="pln">
</span><span class="pun">});</span><span class="pln">


</span><span class="kwd">function</span><span class="pln"> prepareAndSendPlayersData</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
	</span><span class="kwd">var</span><span class="pln"> toSend </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[]</span><span class="pln">
	mp</span><span class="pun">.</span><span class="pln">players</span><span class="pun">.</span><span class="pln">forEach</span><span class="pun">((</span><span class="pln">player</span><span class="pun">)=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
		toSend</span><span class="pun">.</span><span class="pln">push</span><span class="pun">({</span><span class="pln">
			x</span><span class="pun">:</span><span class="pln"> player</span><span class="pun">.</span><span class="pln">position</span><span class="pun">.</span><span class="pln">x</span><span class="pun">,</span><span class="pln">
			y</span><span class="pun">:</span><span class="pln"> player</span><span class="pun">.</span><span class="pln">position</span><span class="pun">.</span><span class="pln">y</span><span class="pun">,</span><span class="pln">
			name</span><span class="pun">:</span><span class="pln"> player</span><span class="pun">.</span><span class="pln">name
		</span><span class="pun">})</span><span class="pln">
	</span><span class="pun">})</span><span class="pln">
	sendPlayersData</span><span class="pun">(</span><span class="pln">toSend</span><span class="pun">)</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">function</span><span class="pln"> sendPlayersData</span><span class="pun">(</span><span class="pln">data</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
	io</span><span class="pun">.</span><span class="pln">sockets</span><span class="pun">.</span><span class="pln">emit</span><span class="pun">(</span><span class="str">'playersData'</span><span class="pun">,</span><span class="pln"> data</span><span class="pun">)</span><span class="pln"> </span><span class="com">// Send our data to every client</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

setInterval</span><span class="pun">(</span><span class="pln">prepareAndSendPlayersData</span><span class="pun">,</span><span class="pln"> </span><span class="lit">200</span><span class="pun">)</span></pre>

		<p>
			 
		</p>
	</div>
</div>

<p style="text-align:center;">
	map.html (put it to server-files/webmap folder)
</p>

<div class="ipsSpoiler" data-ipsspoiler="">
	<div class="ipsSpoiler_header">
		<span>Скрытый текст</span>
	</div>

	<div class="ipsSpoiler_contents">
		<pre class="ipsCode prettyprint lang-html prettyprinted">

<span class="tag">&lt;img</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">'http://blog.damonpollard.com/wp-content/uploads/2013/09/GTAV_SATELLITE_4096x4096.png'</span><span class="pln"> </span><span class="atn">style</span><span class="pun">=</span><span class="atv">"</span><span class="kwd">position</span><span class="pun">:</span><span class="pln"> absolute</span><span class="atv">"</span><span class="tag">&gt;</span><span class="pln">
</span><span class="tag">&lt;canvas</span><span class="pln"> </span><span class="atn">height</span><span class="pun">=</span><span class="atv">'4096'</span><span class="pln">, </span><span class="atn">width</span><span class="pun">=</span><span class="atv">'4096'</span><span class="pln">, </span><span class="atn">id</span><span class="pun">=</span><span class="atv">'map'</span><span class="pln"> </span><span class="atn">style</span><span class="pun">=</span><span class="atv">'</span><span class="kwd">height</span><span class="pun">:</span><span class="pln"> </span><span class="lit">4096px</span><span class="pun">;</span><span class="pln"> </span><span class="kwd">width</span><span class="pun">:</span><span class="pln"> </span><span class="lit">4096px</span><span class="pun">;</span><span class="pln"> </span><span class="kwd">position</span><span class="pun">:</span><span class="pln"> absolute</span><span class="pun">;</span><span class="pln"> </span><span class="kwd">z-index</span><span class="pun">:</span><span class="pln"> </span><span class="lit">9999</span><span class="atv">'</span><span class="tag">&gt;</span><span class="pln">
</span><span class="tag">&lt;script</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">"/socket.io.js"</span><span class="tag">&gt;&lt;/script&gt;</span><span class="pln">
</span><span class="tag">&lt;script&gt;</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> </span><span>ZeroX</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1903</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> </span><span>ZeroY</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">2690</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> </span><span>Scale</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">3.037861303705727</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> getPictureCoords</span><span class="pun">(</span><span class="pln">x</span><span class="pun">,</span><span class="pln"> y</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  x </span><span class="pun">=</span><span class="pln"> x</span><span class="pun">/</span><span>Scale</span><span class="pln">
  y </span><span class="pun">=</span><span class="pln"> y</span><span class="pun">/</span><span>Scale</span><span class="pln">
  </span><span class="kwd">return</span><span class="pln"> </span><span class="pun">{</span><span class="pln">x</span><span class="pun">:</span><span class="pln"> </span><span>ZeroX</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> x </span><span class="pun">,</span><span class="pln"> y</span><span class="pun">:</span><span class="pln"> </span><span>ZeroY</span><span class="pln"> </span><span class="pun">-</span><span class="pln"> y</span><span class="pun">}</span><span class="pln"> </span><span class="com">// Invert Y-axis</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">const</span><span class="pln"> ctx </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">getElementById</span><span class="pun">(</span><span class="str">'map'</span><span class="pun">).</span><span class="pln">getContext</span><span class="pun">(</span><span class="str">'2d'</span><span class="pun">)</span><span class="pln">
ctx</span><span class="pun">.</span><span class="pln">fillStyle </span><span class="pun">=</span><span class="pln"> </span><span class="str">'red'</span><span class="pln">

</span><span class="kwd">function</span><span class="pln"> drawPlayerMarker</span><span class="pun">(</span><span class="pln">x</span><span class="pun">,</span><span class="pln"> y</span><span class="pun">,</span><span class="pln"> name</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
	newCoords </span><span class="pun">=</span><span class="pln"> getPictureCoords</span><span class="pun">(</span><span class="pln">x</span><span class="pun">,</span><span class="pln"> y</span><span class="pun">)</span><span class="pln">
	x </span><span class="pun">=</span><span class="pln"> newCoords</span><span class="pun">.</span><span class="pln">x
	y </span><span class="pun">=</span><span class="pln"> newCoords</span><span class="pun">.</span><span class="pln">y
	ctx</span><span class="pun">.</span><span class="pln">beginPath</span><span class="pun">()</span><span class="pln">
	ctx</span><span class="pun">.</span><span class="pln">arc</span><span class="pun">(</span><span class="pln">x</span><span class="pun">,</span><span class="pln"> y</span><span class="pun">,</span><span class="pln"> </span><span class="lit">5</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span>Math</span><span class="pun">.</span><span class="pln">PI</span><span class="pun">)</span><span class="pln">
	ctx</span><span class="pun">.</span><span class="pln">fill</span><span class="pun">()</span><span class="pln">
	ctx</span><span class="pun">.</span><span class="pln">font </span><span class="pun">=</span><span class="pln"> </span><span class="str">"25px Arial"</span><span class="pun">;</span><span class="pln">
	ctx</span><span class="pun">.</span><span class="pln">fillText</span><span class="pun">(</span><span class="pln">name</span><span class="pun">,</span><span class="pln"> x </span><span class="pun">-</span><span class="pln"> </span><span class="lit">15</span><span class="pun">,</span><span class="pln"> y </span><span class="pun">-</span><span class="pln"> </span><span class="lit">15</span><span class="pun">)</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">var</span><span class="pln"> playersData </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[]</span><span class="pln">

</span><span class="kwd">var</span><span class="pln"> socket </span><span class="pun">=</span><span class="pln"> io</span><span class="pun">(</span><span class="str">'localhost:3000'</span><span class="pun">)</span><span class="pln">

socket</span><span class="pun">.</span><span class="pln">on</span><span class="pun">(</span><span class="str">'playersData'</span><span class="pun">,</span><span class="pln"> </span><span class="pun">(</span><span class="pln">data</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
	playersData </span><span class="pun">=</span><span class="pln"> data
	redraw</span><span class="pun">()</span><span class="pln">
</span><span class="pun">})</span><span class="pln">

</span><span class="kwd">function</span><span class="pln"> redraw</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
	ctx</span><span class="pun">.</span><span class="pln">clearRect</span><span class="pun">(</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">4096</span><span class="pun">,</span><span class="pln"> </span><span class="lit">4096</span><span class="pun">);</span><span class="pln">
	playersData</span><span class="pun">.</span><span class="pln">forEach</span><span class="pun">((</span><span class="pln">player</span><span class="pun">)=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
		drawPlayerMarker</span><span class="pun">(</span><span class="pln">player</span><span class="pun">.</span><span class="pln">x</span><span class="pun">,</span><span class="pln"> player</span><span class="pun">.</span><span class="pln">y</span><span class="pun">,</span><span class="pln"> player</span><span class="pun">.</span><span class="pln">name</span><span class="pun">)</span><span class="pln">
	</span><span class="pun">})</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="tag">&lt;/script&gt;</span></pre>

		<p>
			 
		</p>
	</div>
</div>

<p>
	<strong>This tutorial will be continued </strong>
</p>

<p>
	<font color="#212121"><span style="font-size:16px;">Have a good day!</span></font>
</p>
]]></description><guid isPermaLink="false">4282</guid><pubDate>Sat, 11 May 2019 13:22:09 +0000</pubDate></item><item><title>[Tutorial] Using Entity Framework Core with MySQL</title><link>https://rage.mp/forums/topic/3951-tutorial-using-entity-framework-core-with-mysql/</link><description><![CDATA[
<p>
	<strong>This tutorial will only work if you already have your MySQL + RAGE project set up.</strong><br /><br /><span style="font-size:22px;"><strong>Step 1</strong></span>
</p>

<ul><li>
		Right-click on your project and select '<strong>Manage NuGet Packages...</strong>'.
	</li>
	<li>
		Browse for the following packages and make sure you install the <strong>same version for all</strong>! (this example uses version<strong> 2.2.0</strong>)
		<ul><li>
				Microsoft.EntityFrameworkCore
			</li>
			<li>
				Microsoft.EntityFrameworkCore.Tools
			</li>
			<li>
				Pomelo.EntityFrameworkCore.MySql
			</li>
		</ul></li>
</ul><p>
	<br /><span style="font-size:22px;"><strong>Step 2</strong></span>
</p>

<ul><li>
		Create a <span style="color:#2ecc71;">Player.cs</span> class with the following code:
	</li>
</ul><div class="ipsSpoiler" data-ipsspoiler="">
	<div class="ipsSpoiler_header">
		<span>Spoiler</span>
	</div>

	<div class="ipsSpoiler_contents">
		<pre class="ipsCode prettyprint lang-c prettyprinted">

<span class="kwd">using</span><span class="pln"> </span><span>GTANetworkAPI</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">using</span><span class="pln"> </span><span>System</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">using</span><span class="pln"> </span><span>System</span><span class="pun">.</span><span>ComponentModel</span><span class="pun">.</span><span>DataAnnotations</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">using</span><span class="pln"> </span><span>System</span><span class="pun">.</span><span>ComponentModel</span><span class="pun">.</span><span>DataAnnotations</span><span class="pun">.</span><span>Schema</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">namespace</span><span class="pln"> </span><span>EFCoreTutorial</span><span class="pln"> </span><span class="com">//change this to your own namespace</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span>Player</span><span class="pln">
    </span><span class="pun">{</span><span class="pln">
        </span><span class="pun">[</span><span>Key</span><span class="pun">]</span><span class="pln"> </span><span class="com">//EF Core will know that Id is the unique identifier</span><span class="pln">
        </span><span class="kwd">public</span><span class="pln"> </span><span>int</span><span class="pln"> </span><span>Id</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> get</span><span class="pun">;</span><span class="pln"> </span><span>set</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">

        </span><span class="kwd">public</span><span class="pln"> string </span><span>Name</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> get</span><span class="pun">;</span><span class="pln"> </span><span>set</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">

        </span><span class="pun">[</span><span>NotMapped</span><span class="pun">]</span><span class="pln"> </span><span class="com">//This means that SpawnLocation will not be put into the database. We do this because Vector3 cannot be translated to MySQL</span><span class="pln">
        </span><span class="kwd">public</span><span class="pln"> </span><span>Vector3</span><span class="pln"> </span><span>SpawnLocation</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> get</span><span class="pun">;</span><span class="pln"> </span><span>set</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

		<p>
			 
		</p>
	</div>
</div>

<p>
	<br /><span style="font-size:22px;"><strong>Step 3</strong></span>
</p>

<ul><li>
		Create a new class called '&lt;myProject&gt;Context.cs', in this example we will use <span style="color:#2ecc71;">TutorialContext.cs</span>
	</li>
	<li>
		Paste the following code:
	</li>
</ul><div class="ipsSpoiler" data-ipsspoiler="">
	<div class="ipsSpoiler_header">
		<span>Spoiler</span>
	</div>

	<div class="ipsSpoiler_contents">
		<pre class="ipsCode prettyprint lang-c prettyprinted">

<span class="kwd">using</span><span class="pln"> </span><span>Microsoft</span><span class="pun">.</span><span>EntityFrameworkCore</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">using</span><span class="pln"> </span><span>System</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">using</span><span class="pln"> </span><span>System</span><span class="pun">.</span><span>Collections</span><span class="pun">.</span><span>Generic</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">using</span><span class="pln"> </span><span>System</span><span class="pun">.</span><span>Text</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">namespace</span><span class="pln"> </span><span>EFCoreTutorial</span><span class="pln"> </span><span class="com">//change this to your own namespace</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span>TutorialContext</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span>DbContext</span><span class="pln">
    </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">private</span><span class="pln"> string v</span><span class="pun">;</span><span class="pln">

        </span><span class="kwd">public</span><span class="pln"> </span><span>TutorialContext</span><span class="pun">()</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="kwd">this</span><span class="pun">(</span><span class="str">"server=localhost;database=tutorial;user=root;password=test"</span><span class="pun">)</span><span class="pln">
        </span><span class="pun">{</span><span class="pln">

        </span><span class="pun">}</span><span class="pln">

        </span><span class="kwd">public</span><span class="pln"> </span><span>TutorialContext</span><span class="pun">(</span><span class="pln">string v</span><span class="pun">)</span><span class="pln">
        </span><span class="pun">{</span><span class="pln">
            </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">v </span><span class="pun">=</span><span class="pln"> v</span><span class="pun">;</span><span class="pln">
        </span><span class="pun">}</span><span class="pln">

        </span><span class="kwd">protected</span><span class="pln"> override </span><span class="kwd">void</span><span class="pln"> </span><span>OnConfiguring</span><span class="pun">(</span><span>DbContextOptionsBuilder</span><span class="pln"> optionsBuilder</span><span class="pun">)</span><span class="pln">
        </span><span class="pun">{</span><span class="pln">
            optionsBuilder</span><span class="pun">.</span><span>UseMySql</span><span class="pun">(</span><span class="str">"server=localhost;database=tutorial;user=root;password=test"</span><span class="pun">,</span><span class="pln"> ob </span><span class="pun">=&gt;</span><span class="pln"> ob</span><span class="pun">.</span><span>MigrationsAssembly</span><span class="pun">(</span><span class="kwd">typeof</span><span class="pun">(</span><span>TutorialContext</span><span class="pun">).</span><span>GetTypeInfo</span><span class="pun">().</span><span>Assembly</span><span class="pun">.</span><span>GetName</span><span class="pun">().</span><span>Name</span><span class="pun">));</span><span class="pln">
        </span><span class="pun">}</span><span class="pln">

        </span><span class="kwd">protected</span><span class="pln"> override </span><span class="kwd">void</span><span class="pln"> </span><span>OnModelCreating</span><span class="pun">(</span><span>ModelBuilder</span><span class="pln"> modelBuilder</span><span class="pun">)</span><span class="pln">
        </span><span class="pun">{</span><span class="pln">
            base</span><span class="pun">.</span><span>OnModelCreating</span><span class="pun">(</span><span class="pln">modelBuilder</span><span class="pun">);</span><span class="pln">
        </span><span class="pun">}</span><span class="pln">

        </span><span class="kwd">public</span><span class="pln"> </span><span>DbSet</span><span class="pun">&lt;</span><span>Player</span><span class="pun">&gt;</span><span class="pln"> </span><span>Players</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> get</span><span class="pun">;</span><span class="pln"> </span><span>set</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln"> </span><span class="com">//Without this line, the Player class will not be translated to MySQL and the context will not contain a list of all players from the database.</span><span class="pln">

    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

		<p>
			 
		</p>
	</div>
</div>

<p>
	<br /><br /><span style="font-size:22px;"><strong>Step 4</strong></span>
</p>

<ul><li>
		To make things easier for future classes, we will make an interface called <span style="color:#2ecc71;">IRepository.cs</span>. This is not part of EF Core but it's a nice programming pattern to use with it. Copy-paste the code below into your interface:
	</li>
</ul><div class="ipsSpoiler" data-ipsspoiler="">
	<div class="ipsSpoiler_header">
		<span>Spoiler</span>
	</div>

	<div class="ipsSpoiler_contents">
		<pre class="ipsCode prettyprint lang-c prettyprinted">

<span class="kwd">using</span><span class="pln"> </span><span>System</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">using</span><span class="pln"> </span><span>System</span><span class="pun">.</span><span>Collections</span><span class="pun">.</span><span>Generic</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">using</span><span class="pln"> </span><span>System</span><span class="pun">.</span><span>Text</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">namespace</span><span class="pln"> </span><span>EFCoreTutorial</span><span class="pln"> </span><span class="com">//change to your own namespace</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> interface </span><span>IRepository</span><span class="pun">&lt;</span><span class="pln">T</span><span class="pun">&gt;</span><span class="pln">
    </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">void</span><span class="pln"> </span><span>Add</span><span class="pun">(</span><span class="pln">T entity</span><span class="pun">);</span><span class="pln">
        </span><span class="kwd">void</span><span class="pln"> </span><span>Update</span><span class="pun">(</span><span class="pln">T entity</span><span class="pun">);</span><span class="pln">
        </span><span>IEnumerable</span><span class="pun">&lt;</span><span class="pln">T</span><span class="pun">&gt;</span><span class="pln"> </span><span>GetAll</span><span class="pun">();</span><span class="pln">
        </span><span class="kwd">void</span><span class="pln"> </span><span>Remove</span><span class="pun">(</span><span class="pln">T entity</span><span class="pun">);</span><span class="pln">
        T </span><span>GetById</span><span class="pun">(</span><span>int</span><span class="pln"> id</span><span class="pun">);</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

		<p>
			 
		</p>
	</div>
</div>

<p>
	<br /><span style="font-size:22px;"><strong>Step 5</strong></span>
</p>

<ul><li>
		Create a class called <span style="color:#2ecc71;">PlayerRepository.cs</span> 
	</li>
	<li>
		Now we will implement the interface we just created in our PlayerRepository.cs 
	</li>
</ul><div class="ipsSpoiler" data-ipsspoiler="">
	<div class="ipsSpoiler_header">
		<span>Spoiler</span>
	</div>

	<div class="ipsSpoiler_contents">
		<pre class="ipsCode prettyprint lang-c prettyprinted">

<span class="kwd">using</span><span class="pln"> </span><span>Microsoft</span><span class="pun">.</span><span>EntityFrameworkCore</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">using</span><span class="pln"> </span><span>System</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">using</span><span class="pln"> </span><span>System</span><span class="pun">.</span><span>Collections</span><span class="pun">.</span><span>Generic</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">using</span><span class="pln"> </span><span>System</span><span class="pun">.</span><span>Linq</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">using</span><span class="pln"> </span><span>System</span><span class="pun">.</span><span>Text</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">namespace</span><span class="pln"> </span><span>EFCoreTutorial</span><span class="pln"> </span><span class="com">//change this to your own namespace</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span>PlayerRepository</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span>IRepository</span><span class="pun">&lt;</span><span>Player</span><span class="pun">&gt;</span><span class="pln"> </span><span class="com">//implement the IRepository interface for the Player class</span><span class="pln">
    </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">private</span><span class="pln"> readonly </span><span>TutorialContext</span><span class="pln"> _context </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span>TutorialContext</span><span class="pun">();</span><span class="pln">

        </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span>Add</span><span class="pun">(</span><span>Player</span><span class="pln"> entity</span><span class="pun">)</span><span class="pln">
        </span><span class="pun">{</span><span class="pln">
            _context</span><span class="pun">.</span><span>Players</span><span class="pun">.</span><span>Add</span><span class="pun">(</span><span class="pln">entity</span><span class="pun">);</span><span class="pln">
            _context</span><span class="pun">.</span><span>SaveChanges</span><span class="pun">();</span><span class="pln">
        </span><span class="pun">}</span><span class="pln">

        </span><span class="kwd">public</span><span class="pln"> </span><span>IEnumerable</span><span class="pun">&lt;</span><span>Player</span><span class="pun">&gt;</span><span class="pln"> </span><span>GetAll</span><span class="pun">()</span><span class="pln">
        </span><span class="pun">{</span><span class="pln">
            </span><span class="kwd">return</span><span class="pln"> _context</span><span class="pun">.</span><span>Players</span><span class="pun">;</span><span class="pln">
        </span><span class="pun">}</span><span class="pln">

        </span><span class="kwd">public</span><span class="pln"> </span><span>Player</span><span class="pln"> </span><span>GetById</span><span class="pun">(</span><span>int</span><span class="pln"> id</span><span class="pun">)</span><span class="pln">
        </span><span class="pun">{</span><span class="pln">
            </span><span class="kwd">return</span><span class="pln"> _context</span><span class="pun">.</span><span>Players</span><span class="pun">.</span><span>Find</span><span class="pun">(</span><span class="pln">id</span><span class="pun">);</span><span class="pln">
        </span><span class="pun">}</span><span class="pln">

        </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span>Remove</span><span class="pun">(</span><span>Player</span><span class="pln"> entity</span><span class="pun">)</span><span class="pln">
        </span><span class="pun">{</span><span class="pln">
            _context</span><span class="pun">.</span><span>Players</span><span class="pun">.</span><span>Remove</span><span class="pun">(</span><span class="pln">entity</span><span class="pun">);</span><span class="pln">
            _context</span><span class="pun">.</span><span>SaveChanges</span><span class="pun">();</span><span class="pln">
        </span><span class="pun">}</span><span class="pln">

        </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span>Update</span><span class="pun">(</span><span>Player</span><span class="pln"> entity</span><span class="pun">)</span><span class="pln">
        </span><span class="pun">{</span><span class="pln">
            _context</span><span class="pun">.</span><span>Entry</span><span class="pun">(</span><span class="pln">entity</span><span class="pun">).</span><span>State</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span>EntityState</span><span class="pun">.</span><span>Modified</span><span class="pun">;</span><span class="pln">
            _context</span><span class="pun">.</span><span>SaveChanges</span><span class="pun">();</span><span class="pln">
        </span><span class="pun">}</span><span class="pln">

        </span><span class="com">/* //If for example you want all players from a certain faction, you could do this:
        public IEnumerable&lt;Player&gt; GetByFactionId(int id)
        {
            return _context.Players.Where(x =&gt; x.FactionId == id);
        }
        */</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

		<p>
			 
		</p>
	</div>
</div>

<p>
	<br /><br /><span style="font-size:22px;"><strong>Step 6</strong></span>
</p>

<ul><li>
		Create a class called <span style="color:#2ecc71;">Main.cs</span> so we can test our code on ResourceStart event.
	</li>
	<li>
		Paste the following code
	</li>
</ul><div class="ipsSpoiler" data-ipsspoiler="">
	<div class="ipsSpoiler_header">
		<span>Spoiler</span>
	</div>

	<div class="ipsSpoiler_contents">
		<pre class="ipsCode prettyprint lang-c prettyprinted">

<span class="kwd">using</span><span class="pln"> </span><span>GTANetworkAPI</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">using</span><span class="pln"> </span><span>System</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">using</span><span class="pln"> </span><span>System</span><span class="pun">.</span><span>Collections</span><span class="pun">.</span><span>Generic</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">using</span><span class="pln"> </span><span>System</span><span class="pun">.</span><span>Linq</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">using</span><span class="pln"> </span><span>System</span><span class="pun">.</span><span>Text</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">namespace</span><span class="pln"> </span><span>EFCoreTutorial</span><span class="pln"> </span><span class="com">//change ..</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span>Main</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span>Script</span><span class="pln">
    </span><span class="pun">{</span><span class="pln">
        </span><span class="pun">[</span><span>ServerEvent</span><span class="pun">(</span><span>Event</span><span class="pun">.</span><span>ResourceStart</span><span class="pun">)]</span><span class="pln">
        </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span>OnResourceStart</span><span class="pun">()</span><span class="pln">
        </span><span class="pun">{</span><span class="pln">
            </span><span class="kwd">using</span><span class="pln"> </span><span class="pun">(</span><span class="pln">var context </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span>TutorialContext</span><span class="pun">())</span><span class="pln">
            </span><span class="pun">{</span><span class="pln">
                </span><span class="com">// Creates the database if not exists</span><span class="pln">
                context</span><span class="pun">.</span><span>Database</span><span class="pun">.</span><span>EnsureCreated</span><span class="pun">();</span><span class="pln">
            </span><span class="pun">}</span><span class="pln">

            </span><span class="com">//Testdata for tutorial purpose:</span><span class="pln">
            var repo </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span>PlayerRepository</span><span class="pun">();</span><span class="pln"> </span><span class="com">// repo can now be used to talk to the database</span><span class="pln">

            </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">repo</span><span class="pun">.</span><span>GetAll</span><span class="pun">().</span><span>Count</span><span class="pun">()</span><span class="pln"> </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">1</span><span class="pun">)</span><span class="pln"> </span><span class="com">//if the players table is empty, we insert 3 players</span><span class="pln">
            </span><span class="pun">{</span><span class="pln">

                </span><span>Player</span><span class="pln"> player </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span>Player</span><span class="pun">()</span><span class="pln">
                </span><span class="pun">{</span><span class="pln">
                    </span><span>Name</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"George"</span><span class="pln">
                </span><span class="pun">};</span><span class="pln">
                </span><span>Player</span><span class="pln"> player2 </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span>Player</span><span class="pun">()</span><span class="pln">
                </span><span class="pun">{</span><span class="pln">
                    </span><span>Name</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"John"</span><span class="pln">
                </span><span class="pun">};</span><span class="pln">
                </span><span>Player</span><span class="pln"> player3 </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span>Player</span><span class="pun">()</span><span class="pln">
                </span><span class="pun">{</span><span class="pln">
                    </span><span>Name</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Donald"</span><span class="pun">,</span><span class="pln">
                    </span><span>SpawnLocation</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span>Vector3</span><span class="pun">(</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">)</span><span class="pln">
                </span><span class="pun">};</span><span class="pln">

              </span><span class="com">//Adding players to the database</span><span class="pln">
                repo</span><span class="pun">.</span><span>Add</span><span class="pun">(</span><span class="pln">player</span><span class="pun">);</span><span class="pln">
                repo</span><span class="pun">.</span><span>Add</span><span class="pun">(</span><span class="pln">player2</span><span class="pun">);</span><span class="pln">
                repo</span><span class="pun">.</span><span>Add</span><span class="pun">(</span><span class="pln">player3</span><span class="pun">);</span><span class="pln">

                NAPI</span><span class="pun">.</span><span>Util</span><span class="pun">.</span><span>ConsoleOutput</span><span class="pun">(</span><span class="str">"======== Current players: ========"</span><span class="pun">);</span><span class="pln">
                foreach </span><span class="pun">(</span><span>Player</span><span class="pln"> p in repo</span><span class="pun">.</span><span>GetAll</span><span class="pun">())</span><span class="pln">
                </span><span class="pun">{</span><span class="pln">
                    NAPI</span><span class="pun">.</span><span>Util</span><span class="pun">.</span><span>ConsoleOutput</span><span class="pun">(</span><span class="str">"("</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> p</span><span class="pun">.</span><span>Id</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="str">") "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> p</span><span class="pun">.</span><span>Name</span><span class="pun">);</span><span class="pln">
                </span><span class="pun">}</span><span class="pln">

                NAPI</span><span class="pun">.</span><span>Util</span><span class="pun">.</span><span>ConsoleOutput</span><span class="pun">(</span><span class="str">"======== Updating George to Michael: ========"</span><span class="pun">);</span><span class="pln">
                player</span><span class="pun">.</span><span>Name</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Michael"</span><span class="pun">;</span><span class="pln">
                repo</span><span class="pun">.</span><span>Update</span><span class="pun">(</span><span class="pln">player</span><span class="pun">);</span><span class="pln">

                foreach </span><span class="pun">(</span><span>Player</span><span class="pln"> p in repo</span><span class="pun">.</span><span>GetAll</span><span class="pun">())</span><span class="pln">
                </span><span class="pun">{</span><span class="pln">
                    NAPI</span><span class="pun">.</span><span>Util</span><span class="pun">.</span><span>ConsoleOutput</span><span class="pun">(</span><span class="str">"("</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> p</span><span class="pun">.</span><span>Id</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="str">") "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> p</span><span class="pun">.</span><span>Name</span><span class="pun">);</span><span class="pln">
                </span><span class="pun">}</span><span class="pln">

                NAPI</span><span class="pun">.</span><span>Util</span><span class="pun">.</span><span>ConsoleOutput</span><span class="pun">(</span><span class="str">"======== Deleting John: ========"</span><span class="pun">);</span><span class="pln">
                repo</span><span class="pun">.</span><span>Remove</span><span class="pun">(</span><span class="pln">player2</span><span class="pun">);</span><span class="pln">

                foreach </span><span class="pun">(</span><span>Player</span><span class="pln"> p in repo</span><span class="pun">.</span><span>GetAll</span><span class="pun">())</span><span class="pln">
                </span><span class="pun">{</span><span class="pln">
                    NAPI</span><span class="pun">.</span><span>Util</span><span class="pun">.</span><span>ConsoleOutput</span><span class="pun">(</span><span class="str">"("</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> p</span><span class="pun">.</span><span>Id</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="str">") "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> p</span><span class="pun">.</span><span>Name</span><span class="pun">);</span><span class="pln">
                </span><span class="pun">}</span><span class="pln">

                NAPI</span><span class="pun">.</span><span>Util</span><span class="pun">.</span><span>ConsoleOutput</span><span class="pun">(</span><span class="str">"======== End ========"</span><span class="pun">);</span><span class="pln">
            </span><span class="pun">}</span><span class="pln">

        </span><span class="pun">}</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

		<p>
			 
		</p>
	</div>
</div>

<p>
	<br /><br /><span style="font-size:22px;"><strong>Step 7</strong></span>
</p>

<ul><li>
		<span style="font-size:14px;">Build and run your server</span>
	</li>
	<li>
		<span style="font-size:14px;">You may get an error like:</span>
		<blockquote class="ipsQuote" data-ipsquote="">
			<div class="ipsQuote_citation">
				Quote
			</div>

			<div class="ipsQuote_contents">
				<p>
					Exception message: Unable to load one or more of the requested types.<br /><strong>Could not load file or assembly 'Microsoft.EntityFrameworkCore</strong>, Version=2.2.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60'. The system cannot find the file specified.<br />
					System.IO.FileNotFoundException: Could not load file or assembly 'Microsoft.EntityFrameworkCore, Version=2.2.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60'. The system cannot find the file specified.<br />
					File name: 'Microsoft.EntityFrameworkCore, Version=2.2.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60'
				</p>
			</div>
		</blockquote>
		<br />
		This means that in your RAGE runtime folder (D:\RAGEMP\server-files\bridge\runtime) you are missing the necessary dlls.
	</li>
	<li>
		Head over to (for example) A:\Program Files\<strong>dotnet\sdk\NuGetFallbackFolder</strong>\microsoft.entityframeworkcore\2.2.0\lib\netstandard2.0 and copy the needed .dll to the runtime folder of RAGE.
	</li>
	<li>
		You might have to do this for a couple of dlls. Just go back to the NuGetFallbackFolder and find the right one.
	</li>
	<li>
		If you fixed these errors, this should be the result:
	</li>
</ul><p>
	<img alt="GsiDr9s.png" height="502" src="https://i.imgur.com/GsiDr9s.png" width="511" /></p>

<p>
	 
</p>

<p>
	 
</p>

<p>
	<span style="font-size:22px;"><strong>Step 8 (Extra)</strong></span>
</p>

<ul><li>
		<span style="font-size:14px;">If you're adding more and more classes and you want to add changes to your database, use the following method:</span>
	</li>
</ul><ol><li>
		Create your new class (House.cs for example) and go back to your TutorialContext.cs and add <span style="color:#9b59b6;">public DbSet&lt;House&gt; Houses { get; set; } </span><span>under Players (which we did in this tutorial).</span>
	</li>
	<li>
		On the top left of your Visual Studio you will see a tab called '<strong>View</strong>'. Click on it, go to '<strong>Other Windows</strong>' and select '<strong>Package Manager Console</strong>'.
	</li>
	<li>
		In the Package Manager Console, type: <strong>Add-Migration addedHouse</strong>
	</li>
	<li>
		Wait for the console to finish and type: <strong>Update-Database</strong>
	</li>
	<li>
		<strong>Your house class has now been added to the database. Enjoy.</strong>
	</li>
</ol>]]></description><guid isPermaLink="false">3951</guid><pubDate>Sun, 07 Apr 2019 19:57:39 +0000</pubDate></item></channel></rss>
