Changelog

* **Note: Colour was replaced with Color**

## 0.3.4

* Added: player.getDecoration(collection)
* Added: player.setDecoration(collection, overlay)
* Updated: player.setHeadOverlay(overlayId, [index, opacity, color, secondaryColor])
* Updated: player.getHeadOverlay
* Updated: mp.game.graphics.screen2dToWorld3d(x, y[, collisionTest])
* Updated: click event args are (x, y, state, mouseKey, relativeX, relativeY, 3dpos, entityHandle) now
* Fixed: text label rendering issues
* Fixed: shared variables not reseting for local player clientside after reconnecting
* Fixed: invalid password issue
* Fixed: playerWeaponShot not triggering when there's no any target entity

## RC-2

* Updated: all remote trigger arguments should be passed as an array now, e.g. player.call("eventName", [1, 2, 3]). It was updated only for server-side API as for RC-2.
* Added: vehicle.quaternion
* Added: vehicle.heading
* Added: "this" to events. It includes "cancel" and "handler" properties. Setting "this.cancel = true" would stop triggering futher events this call.

## RC-1

* Added: Vehicle.movable (get)
* Updated: mp.environment is mp.world now
* Added: mp.world.requireIpl
* Added: mp.world.removeIpl
* Added: mp.world.trafficLights.locked (get / set)
* Added: mp.world.trafficLights.state (get / set)
* Added Player.removeObject

## Client-side updates

* Added: mp.gui.cursor.show(visibility, freezeControls)
* Added: Entity.getVariable
* Added: Entity.setVariable
* Added: mp.vehicles.new
* Added: mp.objects.new
* Added: mp.pickups.new
* Added: mp.markers.new
* Added: mp.blips.new
* Added: mp.checkpoints.new
* Added: mp.labels.new
* Updated: mp.game.graphics.drawText(text, position[, additionalArgs])
* Added: Vehicle.setHandling(name, value)
* Added: mp.discord.update(detailedStatus, state)
* Added: mp.game.cam.getGameplayCamRelativeHeading
* Added: Entity.remoteId
* Added: pool.atRemoteId

## Events updates

* Added: Events.getAllOf(eventName)
* Added: Events.remove(eventName[, hander])
* Added: Events.reset()

## Player updates

* Added: Player.weapons (documented below)
* Added: Player.removeWeapon(weapon)
* Added: Player.removeAllWeapons()
* Added: Player.weapon (get / set)
* Added: Player.weaponAmmo (get / set)
* Added: Player.getWeaponAmmo(weapon)
* Added: Player.setWeaponAmmo(weapon, ammo)
* Added: Player.allWeapons (get)
* Added: Player.getHeadOverlay(id)
* Added: Player.setHeadOverlay(id, [overlayId, opacity])
* Added: Player.socialClub (get)
* Added: Player.isStreamed(player)
* Added: Player.streamedPlayers (get)
* Added: Player.isReloading (get)
* Added: Player.isOnLadder (get)
* Added: Player.isInMelee (get)
* Added: Player.packetLoss (get)

## Blip updates

* Added: Blip.shortRange (get / set)
* Added: Blip.drawDistance (get / set)
* Added: Blip.rotation (get / set)
* Updated: Blip.colour => Blip.color (get / set)
* Removed: mp.blips.newStreamed // use .new() with drawDistance ( see below )

## TextLabel updates (includes entity methods)

* Added: TextLabel.color (get / set)
* Added: TextLabel.drawDistance (get / set)
* Added: TextLabel.los (get / set)
* Added: TextLabel.text (get / set)

## Vehicle updates

* Added: Vehicle.mods[id] (get / set) // also available as Vehicle.get / setMod(id) since 0.3
* Added: Vehicle.extras[id] (get / set)
* Added: Vehicle.isStreamed(player)
* Added: Vehicle.streamedPlayers
* Added: Vehicle.dashboardColor (get / set)
* Added: Vehicle.pearlescentColor (get / set)
* Added: Vehicle.livery (get / set)
* Added: Vehicle.numberPlateType (get / set)
* Added: Vehicle.trimColor (get / set)
* Added: Vehicle.windowTint (get / set)
* Added: Vehicle.wheelColor (get / set)
* Added: Vehicle.wheelType (get / set)
* Added: Vehicle.getExtra(id)
* Added: Vehicle.setExtra(id, extra)
* Added: Vehicle.taxiLights (get / set)
* Added: Vehicle.dashboardColor (get / set)
* Added: Vehicle.trailer
* Added: Vehicle.traileredBy

## New events

* Added: entityCreated (entity)
* Added: playerReady (player)
* Added: entityModelChange (entity, oldModel)
* Updated: playerEnterVehicle => playerStartEnterVehicle
* Updated: playerEnteredVehicle => playerEnterVehicle
* Updated: playerExitVehicle => playerStartExitVehicle
* Updated: playerLeftVehicle => playerExitVehicle
* Added: playerDamage (player, healthLoss, armorLoss)
* Added: playerWeaponChange (player, oldWeapon, newWeapon)
* Added: vehicleDamage (vehicle, bodyHealthLoss, engineHealthLoss)
* Added: vehicleSirenToggle (vehicle, state)
* Added: vehicleHornToggle (vehicle)
* Added: vehicleTrailerAttach (vehicle, trailer)
* Added: playerMarkWaypoint (player, position)
* Added: playerReachWaypoint (player)

## Entity updates (for all for entitiy types)

* Added: Entity.data.name (gets / sets synced variable just like getVariable / setVariable)
* Added: Entity.getVariable(name)
* Added: Entity.setVariable(name, value)

## Player.weapons

* Added: Player.weapons.all (returns an object just like Player.allWeapons)
* Added: Player.weapons.name / Player.weapons.hash / Player.weapons.current (gets/sets ammo of specific weapon just like Player.get / setWeaponAmmo)
* Added: Player.weapons.clear()

## Events examples

```
// Add events
mp.events.add(
{
 playerJoin: (player) => {},
 playerChat: (player, msg) => {}
});

//
function playerJoinHandler(player)
{
}

// Add an event
mp.events.add("playerJoin", playerJoinHandler);

// Remove specified handler of specified event
mp.events.remove("playerJoin", playerJoinHandler);

// Remove handler(s) specified event(s)
mp.events.remove("playerJoin");
mp.events.remove(["playerJoin", "playerQuit"]);

// Reset whole event manager
mp.events.reset();

// Get all handlers of specified event
mp.events.getAllOf("playerJoin").forEach(\_ev => \_ev(null));

//
const ev = new mp.Event("playerDeath", (player, reason, killer) =>
{
 mp.players.broadcast('First blood!');
 ev.destroy(); // this event handler will be not called anymore since it's destroyed
});

ev.destroy(); // due to this line the event is never going to be executed if we call this before it

// Per-entity (available for all of entities) event manager
mp.events.add("playerJoin", (player) =>
{
 player.events.push("playerSpawn", (player) =>
 {
 mp.players.broadcast(`hey ${player.name}, this is your first spawn!`);
 return true; // return true from the event to destroys it for the entity after execution
 });
});

```

## New entity constructors

```
mp.vehicles.new(model, position,
{
 heading: heading,
 numberPlate: numberPlate,
 alpha: alpha,
 color: color,
 locked: locked,
 engine: engine,
 dimension: dimension
});

mp.objects.new(model, position,
{
 rotation: rotation,
 alpha: alpha,
 dimension: dimension
});

mp.blips.new(sprite, position,
{
 name: name,
 scale: scale,
 color: color,
 alpha: alpha,
 drawDistance: drawDistance,
 shortRange: shortRange,
 rotation: rotation,
 dimension: dimension,
});

mp.checkpoints.new(type, position, radius,
{
 direction: direction,
 color: color,
 visible: visible,
 dimension: dimension
});

mp.markers.new(type, position, scale,
{
 direction: direction,
 rotation: rotation,
 color: color,
 visible: visible,
 dimension: dimension
});

mp.labels.new(text, position,
{
 los: los,
 font: font,
 drawDistance: drawDistance,
 color: color,
 dimension: dimension
});

```