<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.rage.mp/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Impnumb</id>
	<title>RAGE Multiplayer Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.rage.mp/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Impnumb"/>
	<link rel="alternate" type="text/html" href="https://wiki.rage.mp/wiki/Special:Contributions/Impnumb"/>
	<updated>2026-06-04T09:05:30Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.40.0</generator>
	<entry>
		<id>https://wiki.rage.mp/w/index.php?title=Browser::Browser&amp;diff=20133</id>
		<title>Browser::Browser</title>
		<link rel="alternate" type="text/html" href="https://wiki.rage.mp/w/index.php?title=Browser::Browser&amp;diff=20133"/>
		<updated>2020-11-21T23:58:46Z</updated>

		<summary type="html">&lt;p&gt;Impnumb: add browser events&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Function&#039;&#039;&#039;: Creates a browser&lt;br /&gt;
&lt;br /&gt;
==Parameters==&lt;br /&gt;
* &#039;&#039;&#039;URL&#039;&#039;&#039;: {{RageType|String}}&lt;br /&gt;
&lt;br /&gt;
==Syntax==&lt;br /&gt;
{{ClientsideCode|&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mp.browsers.new(url);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
{{ClientsideCode|&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mp.events.add(&#039;playerReady&#039;, () =&amp;gt; {&lt;br /&gt;
    let browser = mp.browsers.new(&amp;quot;package://index.html&amp;quot;);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
See [[Package Protocol]] for more info on the &amp;lt;code&amp;gt;package://&amp;lt;/code&amp;gt; url.&lt;br /&gt;
&lt;br /&gt;
U can use browser events: [[BrowserCreated]], [[BrowserLoadingFailed]], [[BrowserDomReady]]&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
{{Browser_definition_c}}&lt;br /&gt;
[[Category:Clientside API]]&lt;/div&gt;</summary>
		<author><name>Impnumb</name></author>
	</entry>
	<entry>
		<id>https://wiki.rage.mp/w/index.php?title=Ru:Getting_Started_with_Development&amp;diff=19951</id>
		<title>Ru:Getting Started with Development</title>
		<link rel="alternate" type="text/html" href="https://wiki.rage.mp/w/index.php?title=Ru:Getting_Started_with_Development&amp;diff=19951"/>
		<updated>2020-08-21T20:15:05Z</updated>

		<summary type="html">&lt;p&gt;Impnumb: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
== Требования ==&lt;br /&gt;
&lt;br /&gt;
* [https://cdn.rage.mp/client/updater.exe Апдейтер (он же является установщиком) Rage MP]&lt;br /&gt;
* Базовый [https://developer.mozilla.org/ru/docs/Web/JavaScript JS]/[https://nodejs.org/ru/ NodeJS] опыт программирования&lt;br /&gt;
&lt;br /&gt;
== Введение ==&lt;br /&gt;
&lt;br /&gt;
Сегодня мы покажем вам, как начать разработку Вашего сервера с небольшой учебной статьёй. Покажем, как создать Ваш ресурс и запустить его на вашем сервере.&lt;br /&gt;
&lt;br /&gt;
== Starting the server ==&lt;br /&gt;
&lt;br /&gt;
Когда Вы загрузите [https://cdn.rage.mp/client/updater.exe Апдейтер] и запустите его, вы получите серверные файлы. Появится папка с названием &amp;lt;code&amp;gt;server-files&amp;lt;/code&amp;gt;. Когда Вы откроете папку и запустите файл server.exe, вы найдете там это:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=800px heights=426px&amp;gt;&lt;br /&gt;
File:server-files.png&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Client_packages&#039;&#039;&#039;: Это клиентские скрипты. Они скачиваются на компьютер клиента. (Клиентская сторона позволяет создавать GUI (графический интерфейс) и делать работу [https://bitbucket.org/chromiumembedded/cef CEF].&lt;br /&gt;
*&#039;&#039;&#039;Packages&#039;&#039;&#039;: это сторона сервера. (Серверная сторона позволяет управлять игроком и создавать Ваш собственный мир)&lt;br /&gt;
*&#039;&#039;&#039;Maps&#039;&#039;&#039;: Позволяет Вам загружать карты в Ваш мир. Доступна только форма карт JSON.(Большой &#039;&#039;&#039;JSON&#039;&#039;&#039; размер карты иногда не загружается или загружается очень долго.)&lt;br /&gt;
*&#039;&#039;&#039;Plugins&#039;&#039;&#039;: Позволяет загружать Ваши &#039;&#039;&#039;dll&#039;&#039;&#039; плагины.&lt;br /&gt;
*&#039;&#039;&#039;config&#039;&#039;&#039;: Позволяет  Вам редактировать Ваш сервер. Для большей информации [[Server_settings|кликните тут (EN)]].&lt;br /&gt;
&lt;br /&gt;
Конечно, все папки будут пустыми. Если Вы захотите загрузить игровой режим, то доступен [https://github.com/n-n1ks/rage.mp-freeroam Freeroam] игровой режим для изучения или для Вашего сервера.&lt;br /&gt;
&lt;br /&gt;
== Создание Вашего первого ресурса ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Rage Multiplayer&amp;lt;/b&amp;gt; содержит две стороны скриптинга, &#039;&#039;&#039;Клиентская&#039;&#039;&#039; и &#039;&#039;&#039;Серверная&#039;&#039;&#039;, так как приведенная выше &#039;&#039;&#039;Клиентская&#039;&#039;&#039; позволяет Вам создавать пользовательский интерфейс и показывать людям вашу креативность, a &#039;&#039;&#039;Серверная&#039;&#039;&#039; позволяет управлять сервером с их вещами, такими, как игроками, маркерами, транспортом и т. п.&lt;br /&gt;
&lt;br /&gt;
Сегодня мы создадим наш первый серверный ресурс и посмотрим, как он работает в игре.&lt;br /&gt;
&lt;br /&gt;
Сначала пойдем в папку &amp;lt;code&amp;gt;packages&amp;lt;/code&amp;gt; в Вашей серверной папке, затем создадим файл &amp;lt;code&amp;gt;index.js&amp;lt;/code&amp;gt; , если он еще не существует. После откроем его (обычным блокнотом можно) и пропишем следующие вещи:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// подключаем файл с командами&lt;br /&gt;
require(&#039;./commands.js&#039;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Затем и сохраним и закроем. Сейчас создаем другой файл с названием &amp;lt;code&amp;gt;commands.js&amp;lt;/code&amp;gt; и откроем его.&lt;br /&gt;
&lt;br /&gt;
Добавим немного простых команд в этот файл.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
mp.events.addCommand(&#039;kill&#039;, (player) =&amp;gt; {&lt;br /&gt;
    player.health = 0;&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
mp.events.addCommand(&#039;hp&#039;, (player) =&amp;gt; {&lt;br /&gt;
    player.health = 100;&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
mp.events.addCommand(&#039;armor&#039;, (player) =&amp;gt; {&lt;br /&gt;
    player.armour = 100;&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Если Вы не понимаете что и почему здесь происходит, перейдите к странице [[Getting Started with Commands|Getting started with commands (на английском)]]. Сейчас мы создали простой ресурс с 3 базовыми командами. Первая дает полное здоровье, вторая - броню, третья убивает пользователя.&lt;br /&gt;
&lt;br /&gt;
Сохраняем и закрываем файл. Ничего не замечаете в этом коде неправильного? Если нет, то я вам намекну. Если Вы исполните команду убийства, это означает, что игрок убит, но зареспавнится ли он? У меня есть для Вас решение!&lt;br /&gt;
&lt;br /&gt;
Создайте &#039;&#039;&#039;JSON&#039;&#039;&#039; файл и назовите его &amp;lt;code&amp;gt;spawn_points.json&amp;lt;/code&amp;gt;, затем добавьте в него этот код:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;SpawnPoints&amp;quot;: [&lt;br /&gt;
        { &amp;quot;x&amp;quot;: -425.517, &amp;quot;y&amp;quot;: 1123.620, &amp;quot;z&amp;quot;: 325.8544 },&lt;br /&gt;
        { &amp;quot;x&amp;quot;: -415.777, &amp;quot;y&amp;quot;: 1168.791, &amp;quot;z&amp;quot;: 325.854 },&lt;br /&gt;
        { &amp;quot;x&amp;quot;: -432.534, &amp;quot;y&amp;quot;: 1157.461, &amp;quot;z&amp;quot;: 325.854 },&lt;br /&gt;
        { &amp;quot;x&amp;quot;: -401.850, &amp;quot;y&amp;quot;: 1149.482, &amp;quot;z&amp;quot;: 325.854 }&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Готово? Сохраните и закройте.&lt;br /&gt;
&lt;br /&gt;
Создайте новый файл &amp;lt;code&amp;gt;events.js&amp;lt;/code&amp;gt; и добавьте в него следующий код:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
let spawnPoints = require(&#039;./spawn_points.json&#039;).SpawnPoints;&lt;br /&gt;
&lt;br /&gt;
mp.events.add(&#039;playerDeath&#039;, (player) =&amp;gt; {&lt;br /&gt;
    player.spawn(spawnPoints[Math.floor(Math.random() * spawnPoints.length)]);&lt;br /&gt;
    player.health = 100;&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Мы назначили наши точки спавна, на которых мы хотим заспавнить игрока, затем добавили событие, которое срабатывает, когда игрок умирает. Оно спавнит игрока в рандомном месте из назначенных точек. Не забываем также, что игроку нужно дать полное здоровье, иначе игрок может телепортироваться после убийства по точкам, а затем, возможно, крашнется.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ВАЖНО&#039;&#039;&#039;: Не забывайте запросить файл &amp;lt;code&amp;gt;events.js&amp;lt;/code&amp;gt; внутри &amp;lt;code&amp;gt;index.js&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ваш &amp;lt;code&amp;gt;index.js&amp;lt;/code&amp;gt; файл должен быть похож на это:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
//включение файла с командами&lt;br /&gt;
require(&#039;./commands.js&#039;)&lt;br /&gt;
&lt;br /&gt;
//включение файла с событиями&lt;br /&gt;
require(&#039;./events.js&#039;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Сейчас сохраните все файлы и запустите ваш сервер из файла &amp;lt;code&amp;gt;server.exe&amp;lt;/code&amp;gt;, затем проверьте, что вы сейчас сделали!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Я надеюсь, что помог создать Ваш первый скрипт в RAGE:MP и мы будем надеяться, что создадим дальнейшие статьи для дальнейшего изучения Вами.&lt;br /&gt;
Счастливой игры!&lt;br /&gt;
&lt;br /&gt;
[[Category:Tutorials]]&lt;/div&gt;</summary>
		<author><name>Impnumb</name></author>
	</entry>
	<entry>
		<id>https://wiki.rage.mp/w/index.php?title=Player::giveWeapon&amp;diff=19731</id>
		<title>Player::giveWeapon</title>
		<link rel="alternate" type="text/html" href="https://wiki.rage.mp/w/index.php?title=Player::giveWeapon&amp;diff=19731"/>
		<updated>2020-07-05T13:38:08Z</updated>

		<summary type="html">&lt;p&gt;Impnumb: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This function gives a weapon([[Weapons|see]]) for the player.&lt;br /&gt;
== Syntax ==&lt;br /&gt;
{{JSContainer|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
player.giveWeapon(Number weaponHash, Number ammo)&lt;br /&gt;
player.giveWeapon(Array weaponHash, Number ammo)&lt;br /&gt;
player.giveWeapon(Array weaponHash, Array ammo)&lt;br /&gt;
player.giveWeapon(Object weapons)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
&#039;&#039;&#039;Example 1&#039;&#039;&#039;. This example gives 1 weapon for player.&lt;br /&gt;
{{ServersideCode|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
mp.events.add(&#039;weapon&#039;, (player, _, weapon = &amp;quot;weapon_specialcarbine_mk2&amp;quot;) =&amp;gt; {&lt;br /&gt;
    player.giveWeapon(mp.joaat(weapon), 1000);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Example 2&#039;&#039;&#039;. This example gives 2 weapons for player.&lt;br /&gt;
{{ServersideCode|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
mp.events.add(&#039;playerCommand&#039;, (player, command) =&amp;gt; {&lt;br /&gt;
  let arr = command.split(&#039; &#039;);&lt;br /&gt;
  if (arr[0] == &#039;weapon&#039;) {&lt;br /&gt;
    player.giveWeapon([3220176749, 2210333304], 1000); // Assault Rifle, Carbine Rifle&lt;br /&gt;
  }&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}}}&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
{{Player_block}}&lt;/div&gt;</summary>
		<author><name>Impnumb</name></author>
	</entry>
	<entry>
		<id>https://wiki.rage.mp/w/index.php?title=Player::putIntoVehicle&amp;diff=19728</id>
		<title>Player::putIntoVehicle</title>
		<link rel="alternate" type="text/html" href="https://wiki.rage.mp/w/index.php?title=Player::putIntoVehicle&amp;diff=19728"/>
		<updated>2020-07-03T18:19:00Z</updated>

		<summary type="html">&lt;p&gt;Impnumb: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This function puts player into vehicle.&lt;br /&gt;
== Syntax ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
player.putIntoVehicle(Vehicle vehicle, Number seat)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Seats:&lt;br /&gt;
* -1 - driver seat&lt;br /&gt;
* 0 - passenger seat 1&lt;br /&gt;
* 1 - passenger seat 2&lt;br /&gt;
* 2 - passenger seat 3&lt;br /&gt;
&lt;br /&gt;
In version &amp;gt;1.0 Seats:&lt;br /&gt;
* 0 - driver seat&lt;br /&gt;
* 1 - passenger seat 1&lt;br /&gt;
* 2 - passenger seat 2&lt;br /&gt;
* 3 - passenger seat 3&lt;br /&gt;
&lt;br /&gt;
==Examples==&lt;br /&gt;
{{ServersideCode|&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// 0.3.7&lt;br /&gt;
mp.events.addCommand(&#039;veh&#039;, (player, vehicle = &amp;quot;T20&amp;quot;) =&amp;gt; {&lt;br /&gt;
  const veh = mp.vehicles.new(mp.joaat(vehicle), player.position, {&lt;br /&gt;
    dimension: player.dimension&lt;br /&gt;
  });&lt;br /&gt;
  player.putIntoVehicle(veh, -1);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
// 1.0 +&lt;br /&gt;
mp.events.addCommand(&#039;veh&#039;, (player, vehicle = &amp;quot;T20&amp;quot;) =&amp;gt; {&lt;br /&gt;
  const veh = mp.vehicles.new(mp.joaat(vehicle), player.position, {&lt;br /&gt;
    dimension: player.dimension&lt;br /&gt;
  });&lt;br /&gt;
  player.putIntoVehicle(veh, 0);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
{{Player_block}}&lt;/div&gt;</summary>
		<author><name>Impnumb</name></author>
	</entry>
	<entry>
		<id>https://wiki.rage.mp/w/index.php?title=Changelog&amp;diff=19727</id>
		<title>Changelog</title>
		<link rel="alternate" type="text/html" href="https://wiki.rage.mp/w/index.php?title=Changelog&amp;diff=19727"/>
		<updated>2020-07-03T17:53:02Z</updated>

		<summary type="html">&lt;p&gt;Impnumb: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
==0.3.7==&lt;br /&gt;
&#039;&#039;&#039;EVEN﻿TS&#039;&#039;&#039;&lt;br /&gt;
{{CSharpContainer|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
public class EventsExample : RAGE.Events.Script&lt;br /&gt;
{&lt;br /&gt;
  public EventsExample()&lt;br /&gt;
  {&lt;br /&gt;
    // this kind of events receives mp.trigger, mp.events.callLocal, but also remote events&lt;br /&gt;
    RAGE.Events.AddEvent(&amp;quot;remote_triggerable_event&amp;quot;, SomeEvent);&lt;br /&gt;
    &lt;br /&gt;
    RAGE.Events.AddDataHandler(&amp;quot;some_data&amp;quot;, SomeDataHandler);&lt;br /&gt;
    &lt;br /&gt;
    RAGE.Events.Tick += Tick;&lt;br /&gt;
    RAGE.Events.OnPlayerChat += ChatHandler;&lt;br /&gt;
    &lt;br /&gt;
    // trigger a js event&lt;br /&gt;
    RAGE.Events.CallLocal(&amp;quot;eventName&amp;quot;, 1, &amp;quot;someString&amp;quot;, 1.0f);&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  public void SomeEvent(object[] args)&lt;br /&gt;
  {&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  public void SomeDataHandler(RAGE.Elements.Entity entity, object value)&lt;br /&gt;
  {&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  public void ChatHandler(string text, RAGE.Events.CancelEventArgs cancel)&lt;br /&gt;
  {&lt;br /&gt;
    if(text == &amp;quot;cancelme&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
    	cancel.Cancel = true;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  // known as &amp;quot;render&amp;quot; in JS&lt;br /&gt;
  public void Tick(System.Collections.Generic.List&amp;lt;RAGE.Events.TickNametagData&amp;gt; nametags)&lt;br /&gt;
  {&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;GAME INTERACTION&#039;&#039;&#039;&lt;br /&gt;
{{CSharpContainer|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
// trivial game stuff&lt;br /&gt;
int interior = RAGE.Game.Interior.GetInteriorFromCollision(0.0f, 0.0f, 0.0f);&lt;br /&gt;
&lt;br /&gt;
// player interaction&lt;br /&gt;
RAGE.Elements.Entities.Players.GetAtRemote(1).ClearDecorations();&lt;br /&gt;
&lt;br /&gt;
// player interaction using a game entity handle&lt;br /&gt;
RAGE.Game.Ped.ClearPedDecorations(RAGE.Elements.Player.LocalPlayer.Handle);&lt;br /&gt;
&lt;br /&gt;
// ped creation&lt;br /&gt;
uint freeroamHash = RAGE.Game.Misc.GetHashKey(&amp;quot;mp_m_freemode_01&amp;quot;);&lt;br /&gt;
RAGE.Elements.Ped ped = new RAGE.Elements.Ped(freeroamHash, new RAGE.Vector3(0.0f, 0.0f, 0.0f), dimension: 5);&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;CEF&#039;&#039;&#039;&lt;br /&gt;
{{CSharpContainer|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
  &lt;br /&gt;
public void OurEventHandler(object[] args)&lt;br /&gt;
{&lt;br /&gt;
  RAGE.Chat.Output(&amp;quot;Got actually called! {0}&amp;quot;, (string)args[0]);&lt;br /&gt;
}&lt;br /&gt;
  &lt;br /&gt;
public void TriggerMe()&lt;br /&gt;
{&lt;br /&gt;
  	RAGE.Events.Add(&amp;quot;eventExample&amp;quot;, OurEventHandler);&lt;br /&gt;
  &lt;br /&gt;
	RAGE.Ui.HtmlWindow wnd = new RAGE.Ui.HtmlWindow(&amp;quot;package://index.html&amp;quot;);&lt;br /&gt;
 	wnd.ExecuteJs(&amp;quot;mp.trigger(&#039;eventExample&#039;, &#039;yep&#039;)&amp;quot;);&lt;br /&gt;
  &lt;br /&gt;
  	// &amp;quot;mp.gui.execute&amp;quot;&lt;br /&gt;
  	RAGE.Ui.DefaultWindow.ExecuteJs(&amp;quot;test()&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;BUILT-IN NATIVEUI&#039;&#039;&#039;&lt;br /&gt;
{{CSharpContainer|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
using System;&lt;br /&gt;
using System.Collections.Generic;&lt;br /&gt;
&lt;br /&gt;
using RAGE.NUI;&lt;br /&gt;
&lt;br /&gt;
public class MenuExample&lt;br /&gt;
        : RAGE.Events.Script&lt;br /&gt;
{&lt;br /&gt;
    private bool ketchup = false;&lt;br /&gt;
    private string dish = &amp;quot;Banana&amp;quot;;&lt;br /&gt;
    private MenuPool _menuPool;&lt;br /&gt;
&lt;br /&gt;
    public void AddMenuKetchup(UIMenu menu)&lt;br /&gt;
    {&lt;br /&gt;
        var newitem = new UIMenuCheckboxItem(&amp;quot;Add ketchup?&amp;quot;, ketchup, &amp;quot;Do you wish to add ketchup?&amp;quot;);&lt;br /&gt;
        menu.AddItem(newitem);&lt;br /&gt;
        menu.OnCheckboxChange += (sender, item, checked_) =&amp;gt;&lt;br /&gt;
        {&lt;br /&gt;
            if (item == newitem)&lt;br /&gt;
            {&lt;br /&gt;
                ketchup = checked_;&lt;br /&gt;
                Notify(&amp;quot;~r~Ketchup status: ~b~&amp;quot; + ketchup);&lt;br /&gt;
            }&lt;br /&gt;
        };&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void AddMenuFoods(UIMenu menu)&lt;br /&gt;
    {&lt;br /&gt;
        var foods = new List&amp;lt;dynamic&amp;gt;&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;Banana&amp;quot;,&lt;br /&gt;
            &amp;quot;Apple&amp;quot;,&lt;br /&gt;
            &amp;quot;Pizza&amp;quot;,&lt;br /&gt;
            &amp;quot;Quartilicious&amp;quot;,&lt;br /&gt;
            0xF00D, // Dynamic!&lt;br /&gt;
        };&lt;br /&gt;
        var newitem = new UIMenuListItem(&amp;quot;Food&amp;quot;, foods, 0);&lt;br /&gt;
        menu.AddItem(newitem);&lt;br /&gt;
        menu.OnListChange += (sender, item, index) =&amp;gt;&lt;br /&gt;
        {&lt;br /&gt;
            if (item == newitem)&lt;br /&gt;
            {&lt;br /&gt;
                dish = item.IndexToItem(index).ToString();&lt;br /&gt;
                Notify(&amp;quot;Preparing ~b~&amp;quot; + dish + &amp;quot;~w~...&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
        };&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void AddMenuCook(UIMenu menu)&lt;br /&gt;
    {&lt;br /&gt;
        var newitem = new UIMenuItem(&amp;quot;Cook!&amp;quot;, &amp;quot;Cook the dish with the appropiate ingredients and ketchup.&amp;quot;);&lt;br /&gt;
        newitem.SetLeftBadge(UIMenuItem.BadgeStyle.Star);&lt;br /&gt;
        newitem.SetRightBadge(UIMenuItem.BadgeStyle.Tick);&lt;br /&gt;
        menu.AddItem(newitem);&lt;br /&gt;
        menu.OnItemSelect += (sender, item, index) =&amp;gt;&lt;br /&gt;
        {&lt;br /&gt;
            if (item == newitem)&lt;br /&gt;
            {&lt;br /&gt;
                string output = ketchup ? &amp;quot;You have ordered ~b~{0}~w~ ~r~with~w~ ketchup.&amp;quot; : &amp;quot;You have ordered ~b~{0}~w~ ~r~without~w~ ketchup.&amp;quot;;&lt;br /&gt;
                Notify(String.Format(output, dish));&lt;br /&gt;
            }&lt;br /&gt;
        };&lt;br /&gt;
        menu.OnIndexChange += (sender, index) =&amp;gt;&lt;br /&gt;
        {&lt;br /&gt;
            if (sender.MenuItems[index] == newitem)&lt;br /&gt;
                newitem.SetLeftBadge(UIMenuItem.BadgeStyle.None);&lt;br /&gt;
        };&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void AddMenuAnotherMenu(UIMenu menu)&lt;br /&gt;
    {&lt;br /&gt;
        var submenu = _menuPool.AddSubMenu(menu, &amp;quot;Another Menu&amp;quot;);&lt;br /&gt;
        for (int i = 0; i &amp;lt; 20; i++)&lt;br /&gt;
            submenu.AddItem(new UIMenuItem(&amp;quot;PageFiller&amp;quot;, &amp;quot;Sample description that takes more than one line. Moreso, it takes way more than two lines since it&#039;s so long. Wow, check out this length!&amp;quot;));&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void DrawMenu(System.Collections.Generic.List&amp;lt;RAGE.Events.TickNametagData&amp;gt; nametags)&lt;br /&gt;
    {&lt;br /&gt;
        _menuPool.ProcessMenus();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public MenuExample()&lt;br /&gt;
    {&lt;br /&gt;
        _menuPool = new MenuPool();&lt;br /&gt;
        var mainMenu = new UIMenu(&amp;quot;Native UI&amp;quot;, &amp;quot;~b~NATIVEUI SHOWCASE&amp;quot;);&lt;br /&gt;
      &lt;br /&gt;
      	// original NativeUI replicates GTA V &amp;quot;interaction menu&amp;quot;, &lt;br /&gt;
      	//changing FreezeAllInput to true makes the player completely frozen&lt;br /&gt;
      	// while the menu is active&lt;br /&gt;
        mainMenu.FreezeAllInput = true;&lt;br /&gt;
      &lt;br /&gt;
        _menuPool.Add(mainMenu);&lt;br /&gt;
        AddMenuKetchup(mainMenu);&lt;br /&gt;
        AddMenuFoods(mainMenu);&lt;br /&gt;
        AddMenuCook(mainMenu);&lt;br /&gt;
        AddMenuAnotherMenu(mainMenu);&lt;br /&gt;
        _menuPool.RefreshIndex();&lt;br /&gt;
&lt;br /&gt;
        RAGE.Events.Tick += DrawMenu;&lt;br /&gt;
&lt;br /&gt;
        mainMenu.Visible = true;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void Notify(string text)&lt;br /&gt;
    {&lt;br /&gt;
        RAGE.Game.Ui.SetNotificationTextEntry(&amp;quot;STRING&amp;quot;);&lt;br /&gt;
        RAGE.Game.Ui.AddTextComponentSubstringPlayerName(text);&lt;br /&gt;
        RAGE.Game.Ui.DrawNotification(false, false);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
*JS: &amp;quot;entityDataChange&amp;quot; event has been replaced with &amp;quot;mp.events.addDataHandler(key, handler)&amp;quot;&lt;br /&gt;
*JS: added mp.events.callLocal&lt;br /&gt;
*Improvements on initial server loading&lt;br /&gt;
*Fix voice chat not getting cleared properly after setting &amp;quot;voice3d&amp;quot; to false&lt;br /&gt;
*Improve voice chat playback thread synchronization mechanism, so it doesn&#039;t affect anything else&lt;br /&gt;
*Fix reported voice chat crashes&lt;br /&gt;
*0.4&#039;s game interaction performance improvements backport&lt;br /&gt;
*Fix in-game UI not saving &amp;quot;latest IP connected to&amp;quot; correctly&lt;br /&gt;
*DataStorage UTF-8 support fixes&lt;br /&gt;
*Added a smoother voice chat packet loss handling&lt;br /&gt;
*Fixed reported voice chat stability issues&lt;br /&gt;
*Fixed some specific remote player tasks stuck after finished&lt;br /&gt;
*Added &amp;quot;experimental web platform features&amp;quot; flag to the in-game CEF&lt;br /&gt;
*Fixed key binding issues with isDown param = false&lt;br /&gt;
&lt;br /&gt;
==0.3.6==&lt;br /&gt;
General changes&lt;br /&gt;
*Added: server-based voice chat (server config option to enable: `voice-chat`: true)&lt;br /&gt;
*Updated: Scripting stability improvements (&amp;quot;undefined&amp;quot; errors should be fixed now, needs to be confirmed)&lt;br /&gt;
*Updated: V8 (a separate vanilla one is used client-side now, not the one bundled with NodeJS)&lt;br /&gt;
*Updated: Security enhancements&lt;br /&gt;
*Added: Grand Theft Auto V&#039;s 1.45 patch support&lt;br /&gt;
*Reimplemented &amp;quot;construction zone crash&amp;quot; fix&lt;br /&gt;
*Vehicle model limit adjustment (it&#039;s not an actual 0.4 backport since it uses another method that doesn&#039;t rely on 0.4 features)&lt;br /&gt;
*Updated NodeJS&lt;br /&gt;
*Backported native fool proofing&lt;br /&gt;
*Added &amp;quot;allow-voice-chat-input&amp;quot; option (only available via registry at the moment); default value: 1&lt;br /&gt;
*Updated: CEF (Chromium 70.0.3538.77)&lt;br /&gt;
*Fixed: potential aiming synchronization data corruption&lt;br /&gt;
*Added: more game limits have been adjusted so more global conversion mods are compatible now&lt;br /&gt;
*Fixed: custom dlc packs conflicting with certain game dlc pack&lt;br /&gt;
*Fixed: dlc packs not working correctly with FQDN&lt;br /&gt;
*Miscellaneous fixes&lt;br /&gt;
&lt;br /&gt;
Scripting&lt;br /&gt;
*Added: mp.voiceChat.muted (client-side)&lt;br /&gt;
*Added: mp.voiceChat.getPreprocessingParam(param) (client-side)&lt;br /&gt;
*Added: mp.voiceChat.setPreprocessingParam(param, value) (client-side)&lt;br /&gt;
*Added: player.voiceVolume (client-side)&lt;br /&gt;
*Added: player.voice3d (client-side)&lt;br /&gt;
*Added: player.voiceAutoVolume (client-side)&lt;br /&gt;
*Added: player.isVoiceActive (client-side)&lt;br /&gt;
*Added: event: playerStartTalking (client-side)&lt;br /&gt;
*Added: event: playerStopTalking (client-side)&lt;br /&gt;
*Added: player.enableVoiceTo(target) (server-side)&lt;br /&gt;
*Added: player.disableVoiceTo(target) (server-side)&lt;br /&gt;
*Added: player.voiceListeners (server-side)&lt;br /&gt;
*Added: mp.voiceChat.isAllowed (read-only) (client-side)&lt;br /&gt;
*Added: player.clearDecorations() (server-side)&lt;br /&gt;
*Added: player.getVoiceAttribute(attribute) (client-side)&lt;br /&gt;
*Added: player.setVoiceAttribute(attribute, value) (client-side)&lt;br /&gt;
*Fixed: vehicle.getOccupant&lt;br /&gt;
*Updated: C# enums&lt;br /&gt;
*Fixed: C# UTF-8 support improvements &lt;br /&gt;
&lt;br /&gt;
==0.3.4==&lt;br /&gt;
*Added: player.getDecoration(collection)&lt;br /&gt;
*Added: player.setDecoration(collection, overlay)&lt;br /&gt;
*Updated: player.setHeadOverlay(overlayId, [index, opacity, color, secondaryColor])&lt;br /&gt;
*Updated: player.getHeadOverlay&lt;br /&gt;
*Updated: mp.game.graphics.screen2dToWorld3d(x, y[, collisionTest])&lt;br /&gt;
*Updated: click event args are (x, y, state, mouseKey, relativeX, relativeY, 3dpos, entityHandle) now&lt;br /&gt;
*Fixed: text label rendering issues&lt;br /&gt;
*Fixed: shared variables not reseting for local player clientside after reconnecting&lt;br /&gt;
*Fixed: invalid password issue&lt;br /&gt;
*Fixed: playerWeaponShot not triggering when there&#039;s no any target entity&lt;br /&gt;
&lt;br /&gt;
==RC-2==&lt;br /&gt;
*Updated: all remote trigger arguments should be passed as an array now, e.g. player.call(&amp;quot;eventName&amp;quot;, [1, 2, 3]). It was updated only for server-side API as for RC-2.&lt;br /&gt;
*Added: vehicle.quaternion&lt;br /&gt;
*Added: vehicle.heading&lt;br /&gt;
*Added: &amp;quot;this&amp;quot; to events. It includes &amp;quot;cancel&amp;quot; and &amp;quot;handler&amp;quot; properties. Setting &amp;quot;this.cancel = true&amp;quot; would stop triggering futher events this call. &lt;br /&gt;
&lt;br /&gt;
==RC-1==&lt;br /&gt;
*Added: Vehicle.movable (get)&lt;br /&gt;
*Updated: mp.environment is mp.world now&lt;br /&gt;
*Added: mp.world.requireIpl&lt;br /&gt;
*Added: mp.world.removeIpl&lt;br /&gt;
*Added: mp.world.trafficLights.locked (get / set)&lt;br /&gt;
*Added: mp.world.trafficLights.state (get / set)&lt;br /&gt;
*Added Player.removeObject&lt;br /&gt;
&lt;br /&gt;
==Client-side updates==&lt;br /&gt;
*Added: mp.gui.cursor.show(visibility, freezeControls)&lt;br /&gt;
*Added: Entity.getVariable&lt;br /&gt;
*Added: Entity.setVariable&lt;br /&gt;
*Added: mp.vehicles.new&lt;br /&gt;
*Added: mp.objects.new&lt;br /&gt;
*Added: mp.pickups.new&lt;br /&gt;
*Added: mp.markers.new&lt;br /&gt;
*Added: mp.blips.new&lt;br /&gt;
*Added: mp.checkpoints.new&lt;br /&gt;
*Added: mp.labels.new&lt;br /&gt;
*Updated: mp.game.graphics.drawText(text, position[, additionalArgs])&lt;br /&gt;
*Added: Vehicle.setHandling(name, value)&lt;br /&gt;
*Added: mp.discord.update(detailedStatus, state)&lt;br /&gt;
*Added: mp.game.cam.getGameplayCamRelativeHeading&lt;br /&gt;
*Added: Entity.remoteId&lt;br /&gt;
*Added: pool.atRemoteId&lt;br /&gt;
&lt;br /&gt;
==Events updates==&lt;br /&gt;
*Added: Events.getAllOf(eventName)&lt;br /&gt;
*Added: Events.remove(eventName[, hander])&lt;br /&gt;
*Added: Events.reset()&lt;br /&gt;
&lt;br /&gt;
==Player updates==&lt;br /&gt;
*Added: Player.weapons (documented below)&lt;br /&gt;
*Added: Player.removeWeapon(weapon)&lt;br /&gt;
*Added: Player.removeAllWeapons()&lt;br /&gt;
*Added: Player.weapon (get / set)&lt;br /&gt;
*Added: Player.weaponAmmo (get / set)&lt;br /&gt;
*Added: Player.getWeaponAmmo(weapon)&lt;br /&gt;
*Added: Player.setWeaponAmmo(weapon, ammo)&lt;br /&gt;
*Added: Player.allWeapons (get)&lt;br /&gt;
*Added: Player.getHeadOverlay(id)&lt;br /&gt;
*Added: Player.setHeadOverlay(id, [overlayId, opacity])&lt;br /&gt;
*Added: Player.socialClub (get)&lt;br /&gt;
*Added: Player.isStreamed(player)&lt;br /&gt;
*Added: Player.streamedPlayers (get)&lt;br /&gt;
*Added: Player.isReloading (get)&lt;br /&gt;
*Added: Player.isOnLadder (get)&lt;br /&gt;
*Added: Player.isInMelee (get)&lt;br /&gt;
*Added: Player.packetLoss (get)&lt;br /&gt;
&lt;br /&gt;
==Blip updates==&lt;br /&gt;
*Added: Blip.shortRange (get / set)&lt;br /&gt;
*Added: Blip.drawDistance (get / set)&lt;br /&gt;
*Added: Blip.rotation (get / set)&lt;br /&gt;
*Updated: Blip.colour =&amp;gt; Blip.color (get / set)&lt;br /&gt;
*Removed: mp.blips.newStreamed // use .new() with drawDistance ( see below )&lt;br /&gt;
&lt;br /&gt;
==TextLabel updates (includes entity methods)==&lt;br /&gt;
*Added: TextLabel.color (get / set)&lt;br /&gt;
*Added: TextLabel.drawDistance (get / set)&lt;br /&gt;
*Added: TextLabel.los (get / set)&lt;br /&gt;
*Added: TextLabel.text (get / set)&lt;br /&gt;
&lt;br /&gt;
==Vehicle updates==&lt;br /&gt;
*Added: Vehicle.mods[id] (get / set) // also available as Vehicle.get / setMod(id) since 0.3&lt;br /&gt;
*Added: Vehicle.extras[id] (get / set)&lt;br /&gt;
*Added: Vehicle.isStreamed(player)&lt;br /&gt;
*Added: Vehicle.streamedPlayers&lt;br /&gt;
*Added: Vehicle.dashboardColor (get / set)&lt;br /&gt;
*Added: Vehicle.pearlescentColor (get / set)&lt;br /&gt;
*Added: Vehicle.livery (get / set)&lt;br /&gt;
*Added: Vehicle.numberPlateType (get / set)&lt;br /&gt;
*Added: Vehicle.trimColor (get / set)&lt;br /&gt;
*Added: Vehicle.windowTint (get / set)&lt;br /&gt;
*Added: Vehicle.wheelColor (get / set)&lt;br /&gt;
*Added: Vehicle.wheelType (get / set)&lt;br /&gt;
*Added: Vehicle.getExtra(id)&lt;br /&gt;
*Added: Vehicle.setExtra(id, extra)&lt;br /&gt;
*Added: Vehicle.taxiLights (get / set)&lt;br /&gt;
*Added: Vehicle.dashboardColor (get / set)&lt;br /&gt;
*Added: Vehicle.trailer&lt;br /&gt;
*Added: Vehicle.traileredBy&lt;br /&gt;
 &lt;br /&gt;
==New events==&lt;br /&gt;
*Added: entityCreated (entity)&lt;br /&gt;
*Added: playerReady (player)&lt;br /&gt;
*Added: entityModelChange (entity, oldModel)&lt;br /&gt;
*Updated: playerEnterVehicle =&amp;gt; playerStartEnterVehicle&lt;br /&gt;
*Updated: playerEnteredVehicle =&amp;gt; playerEnterVehicle&lt;br /&gt;
*Updated: playerExitVehicle =&amp;gt; playerStartExitVehicle&lt;br /&gt;
*Updated: playerLeftVehicle =&amp;gt; playerExitVehicle&lt;br /&gt;
*Added: playerDamage (player, healthLoss, armorLoss)&lt;br /&gt;
*Added: playerWeaponChange (player, oldWeapon, newWeapon)&lt;br /&gt;
*Added: vehicleDamage (vehicle, bodyHealthLoss, engineHealthLoss)&lt;br /&gt;
*Added: vehicleSirenToggle (vehicle, state)&lt;br /&gt;
*Added: vehicleHornToggle (vehicle)&lt;br /&gt;
*Added: vehicleTrailerAttach (vehicle, trailer)&lt;br /&gt;
*Added: playerMarkWaypoint (player, position)&lt;br /&gt;
*Added: playerReachWaypoint (player)&lt;br /&gt;
&lt;br /&gt;
==Entity updates (for all for entitiy types)==&lt;br /&gt;
*Added: Entity.data.name (gets / sets synced variable just like getVariable / setVariable)&lt;br /&gt;
*Added: Entity.getVariable(name)&lt;br /&gt;
*Added: Entity.setVariable(name, value)&lt;br /&gt;
&lt;br /&gt;
==Player.weapons==&lt;br /&gt;
*Added: Player.weapons.all (returns an object just like Player.allWeapons)&lt;br /&gt;
*Added: Player.weapons.name / Player.weapons.hash / Player.weapons.current (gets/sets ammo of specific weapon just like Player.get / setWeaponAmmo)&lt;br /&gt;
*Added: Player.weapons.clear()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Events examples==&lt;br /&gt;
{{JSContainer|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
// Add events&lt;br /&gt;
mp.events.add(&lt;br /&gt;
{&lt;br /&gt;
    playerJoin: (player) =&amp;gt; {},&lt;br /&gt;
    playerChat: (player, msg) =&amp;gt; {}&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
function playerJoinHandler(player)&lt;br /&gt;
{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Add an event&lt;br /&gt;
mp.events.add(&amp;quot;playerJoin&amp;quot;, playerJoinHandler);&lt;br /&gt;
&lt;br /&gt;
// Remove specified handler of specified event&lt;br /&gt;
mp.events.remove(&amp;quot;playerJoin&amp;quot;, playerJoinHandler);&lt;br /&gt;
&lt;br /&gt;
// Remove handler(s) specified event(s)&lt;br /&gt;
mp.events.remove(&amp;quot;playerJoin&amp;quot;);&lt;br /&gt;
mp.events.remove([&amp;quot;playerJoin&amp;quot;, &amp;quot;playerQuit&amp;quot;]);&lt;br /&gt;
&lt;br /&gt;
// Reset whole event manager&lt;br /&gt;
mp.events.reset();&lt;br /&gt;
&lt;br /&gt;
// Get all handlers of specified event&lt;br /&gt;
mp.events.getAllOf(&amp;quot;playerJoin&amp;quot;).forEach(_ev =&amp;gt; _ev(null));&lt;br /&gt;
&lt;br /&gt;
// &lt;br /&gt;
const ev = new mp.Event(&amp;quot;playerDeath&amp;quot;, (player, reason, killer) =&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    mp.players.broadcast(&#039;First blood!&#039;);&lt;br /&gt;
    ev.destroy(); // this event handler will be not called anymore since it&#039;s destroyed&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
ev.destroy(); // due to this line the event is never going to be executed if we call this before it&lt;br /&gt;
&lt;br /&gt;
// Per-entity (available for all of entities) event manager&lt;br /&gt;
mp.events.add(&amp;quot;playerJoin&amp;quot;, (player) =&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
    player.events.push(&amp;quot;playerSpawn&amp;quot;, (player) =&amp;gt;&lt;br /&gt;
    {&lt;br /&gt;
        mp.players.broadcast(`hey ${player.name}, this is your first spawn!`);&lt;br /&gt;
        return true; // return true from the event to destroys it for the entity after execution&lt;br /&gt;
    });&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight &amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
==New entity constructors==&lt;br /&gt;
{{JSContainer|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
mp.vehicles.new(model, position,&lt;br /&gt;
{&lt;br /&gt;
    heading: heading,&lt;br /&gt;
    numberPlate: numberPlate,&lt;br /&gt;
    alpha: alpha,&lt;br /&gt;
    color: color,&lt;br /&gt;
    locked: locked,&lt;br /&gt;
    engine: engine,&lt;br /&gt;
    dimension: dimension&lt;br /&gt;
});&lt;br /&gt;
 &lt;br /&gt;
mp.objects.new(model, position,&lt;br /&gt;
{&lt;br /&gt;
    rotation: rotation,&lt;br /&gt;
    alpha: alpha,&lt;br /&gt;
    dimension: dimension&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
mp.blips.new(sprite, position,&lt;br /&gt;
{&lt;br /&gt;
    name: name,&lt;br /&gt;
    scale: scale,&lt;br /&gt;
    color: color,&lt;br /&gt;
    alpha: alpha,&lt;br /&gt;
    drawDistance: drawDistance,&lt;br /&gt;
    shortRange: shortRange,&lt;br /&gt;
    rotation: rotation,&lt;br /&gt;
    dimension: dimension,&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
mp.checkpoints.new(type, position, radius,&lt;br /&gt;
{&lt;br /&gt;
    direction: direction,&lt;br /&gt;
    color: color,&lt;br /&gt;
    visible: visible,&lt;br /&gt;
    dimension: dimension&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
mp.markers.new(type, position, scale,&lt;br /&gt;
{&lt;br /&gt;
    direction: direction,&lt;br /&gt;
    rotation: rotation,&lt;br /&gt;
    color: color,&lt;br /&gt;
    visible: visible,&lt;br /&gt;
    dimension: dimension&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
mp.labels.new(text, position,&lt;br /&gt;
{&lt;br /&gt;
    los: los,&lt;br /&gt;
    font: font,&lt;br /&gt;
    drawDistance: drawDistance,&lt;br /&gt;
    color: color,&lt;br /&gt;
    dimension: dimension&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Impnumb</name></author>
	</entry>
	<entry>
		<id>https://wiki.rage.mp/w/index.php?title=Ru:PlayerEnterCheckpoint&amp;diff=19723</id>
		<title>Ru:PlayerEnterCheckpoint</title>
		<link rel="alternate" type="text/html" href="https://wiki.rage.mp/w/index.php?title=Ru:PlayerEnterCheckpoint&amp;diff=19723"/>
		<updated>2020-06-28T07:53:42Z</updated>

		<summary type="html">&lt;p&gt;Impnumb: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Срабатывает, когда игрок заходит на checkpoint.&lt;br /&gt;
&lt;br /&gt;
==Parameters==&lt;br /&gt;
* &#039;&#039;&#039;checkpoint&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
mp.events.add(&amp;quot;playerEnterCheckpoint&amp;quot;, (player, checkpoint) =&amp;gt; {&lt;br /&gt;
 // Код&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Impnumb</name></author>
	</entry>
	<entry>
		<id>https://wiki.rage.mp/w/index.php?title=Ru:PlayerEnterCheckpoint&amp;diff=19722</id>
		<title>Ru:PlayerEnterCheckpoint</title>
		<link rel="alternate" type="text/html" href="https://wiki.rage.mp/w/index.php?title=Ru:PlayerEnterCheckpoint&amp;diff=19722"/>
		<updated>2020-06-28T07:51:50Z</updated>

		<summary type="html">&lt;p&gt;Impnumb: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Срабатывает, когда игрок заходит на checkpont.&lt;br /&gt;
&lt;br /&gt;
==Parameters==&lt;br /&gt;
* &#039;&#039;&#039;checkpoint&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
mp.events.add(&amp;quot;playerEnterCheckpoint&amp;quot;, (player, checkpoint) =&amp;gt; {&lt;br /&gt;
 // Код&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Impnumb</name></author>
	</entry>
</feed>