<?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=Sn00py</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=Sn00py"/>
	<link rel="alternate" type="text/html" href="https://wiki.rage.mp/wiki/Special:Contributions/Sn00py"/>
	<updated>2026-06-03T21:46:42Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.40.0</generator>
	<entry>
		<id>https://wiki.rage.mp/w/index.php?title=User:Sn00py&amp;diff=16301</id>
		<title>User:Sn00py</title>
		<link rel="alternate" type="text/html" href="https://wiki.rage.mp/w/index.php?title=User:Sn00py&amp;diff=16301"/>
		<updated>2018-11-28T23:14:14Z</updated>

		<summary type="html">&lt;p&gt;Sn00py: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sn00py - What he / she is ...&lt;br /&gt;
&lt;br /&gt;
Sn00py is an Dumbass from germany ... Credits goes to -&amp;gt; &#039;&#039;&#039;! C# Ambassador ¦ Employer&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
But all i can say is i am 31 years old and have fun with that what i am do :) Love RageMP and it&#039;s creator. But missing some friendly help :(&lt;/div&gt;</summary>
		<author><name>Sn00py</name></author>
	</entry>
	<entry>
		<id>https://wiki.rage.mp/w/index.php?title=User:Sn00py&amp;diff=16300</id>
		<title>User:Sn00py</title>
		<link rel="alternate" type="text/html" href="https://wiki.rage.mp/w/index.php?title=User:Sn00py&amp;diff=16300"/>
		<updated>2018-11-28T23:13:33Z</updated>

		<summary type="html">&lt;p&gt;Sn00py: Created page with &amp;quot;Sn00py - What he / she is ...  Sn00py is an Dumbass from germany ... Credits goes to -&amp;gt; &amp;#039;&amp;#039;&amp;#039;! C# Ambassador ¦ Employer&amp;#039;&amp;#039;&amp;#039;  But all i can say is i am 31 years old and have fun...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sn00py - What he / she is ...&lt;br /&gt;
&lt;br /&gt;
Sn00py is an Dumbass from germany ... Credits goes to -&amp;gt; &#039;&#039;&#039;! C# Ambassador ¦ Employer&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
But all i can say is i am 31 years old and have fun with that what i am do :) Love RageMP and it&#039;s vcreator. But missing some friendly help :(&lt;/div&gt;</summary>
		<author><name>Sn00py</name></author>
	</entry>
	<entry>
		<id>https://wiki.rage.mp/w/index.php?title=Changelog&amp;diff=16075</id>
		<title>Changelog</title>
		<link rel="alternate" type="text/html" href="https://wiki.rage.mp/w/index.php?title=Changelog&amp;diff=16075"/>
		<updated>2018-11-25T02:21:45Z</updated>

		<summary type="html">&lt;p&gt;Sn00py: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
*&#039;&#039;&#039;Note: Colour was replaced with Color&#039;&#039;&#039;&lt;br /&gt;
==0.3.7==&lt;br /&gt;
&#039;&#039;&#039;EVEN﻿TS&#039;&#039;&#039;&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;
&#039;&#039;&#039;CEF&#039;&#039;&#039;&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;GAME INTERACTION&#039;&#039;&#039;&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;
&#039;&#039;&#039;BUILT-IN NATIVEUI&#039;&#039;&#039;&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;
*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;
&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;
==New entity constructors==&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;/div&gt;</summary>
		<author><name>Sn00py</name></author>
	</entry>
	<entry>
		<id>https://wiki.rage.mp/w/index.php?title=Changelog&amp;diff=16074</id>
		<title>Changelog</title>
		<link rel="alternate" type="text/html" href="https://wiki.rage.mp/w/index.php?title=Changelog&amp;diff=16074"/>
		<updated>2018-11-25T02:14:21Z</updated>

		<summary type="html">&lt;p&gt;Sn00py: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
*&#039;&#039;&#039;Note: Colour was replaced with Color&#039;&#039;&#039;&lt;br /&gt;
==0.3.7==&lt;br /&gt;
&#039;&#039;&#039;EVEN﻿TS&#039;&#039;&#039;&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;
&#039;&#039;&#039;CEF&#039;&#039;&#039;&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;GAME INTERACTION&#039;&#039;&#039;&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;
&#039;&#039;&#039;BUILT-IN NATIVEUI&#039;&#039;&#039;&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;
*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.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;
&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;
==New entity constructors==&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;/div&gt;</summary>
		<author><name>Sn00py</name></author>
	</entry>
</feed>