Skip to main content

Client Exports

All client exports are called via exports.msk_vehiclekeys:<name>(...).

info

Many functions accept a vehicle handle (int) directly, while the key functions also accept a {plate, model} table so you can act on vehicles that are not currently spawned.


(Un)locking​

toggleLock​

(Un)locks a vehicle. When used as the inventory item export, the vehicle data is read from the item's metadata.

Parameters
data - any - Reserved (pass nil)
slot - table - {metadata = {plate, model}} or {metadata = {vehicle}}

-- From a vehicle handle
local vehicle = GetVehiclePedIsIn(PlayerPedId(), false)
exports.msk_vehiclekeys:toggleLock(nil, {metadata = {plate = GetVehicleNumberPlateText(vehicle), model = GetEntityModel(vehicle)}})

-- Directly with a vehicle entity
exports.msk_vehiclekeys:toggleLock(nil, {metadata = {vehicle = vehicle}})

toggleLockAdmin​

(Un)locks a vehicle without needing a key. The caller must be allowed by Config.AdminCommand.

Parameters
data - table - {vehicle} or {plate, model}

exports.msk_vehiclekeys:toggleLockAdmin({vehicle = vehicle})
exports.msk_vehiclekeys:toggleLockAdmin({plate = 'LS 1234', model = `adder`})

Lock State​

GetVehicleLockState​

Parameters
vehicle - int - A vehicle handle

Returns
isLocked - boolean

local isLocked = exports.msk_vehiclekeys:GetVehicleLockState(vehicle)
local isLocked = Entity(vehicle).state.isLocked -- alternative

GetVehicleLockStatus​

Parameters
vehicle - int - A vehicle handle

Returns
lockStatus - number - 1 = unlocked, 2 = locked

local lockStatus = exports.msk_vehiclekeys:GetVehicleLockStatus(vehicle)
local lockStatus = Entity(vehicle).state.lockState -- alternative
Internal exports

SetVehicleLockState and SetVehicleLockStatus also exist but are for internal use. Do not call them unless you know exactly what you are doing. They can break the script.


openKeysMenu​

Opens the keys menu.

exports.msk_vehiclekeys:openKeysMenu()

openLocksmithMenu​

Opens the locksmith menu (exchange vehicle locks).

exports.msk_vehiclekeys:openLocksmithMenu()

openDialog​

Opens the transfer/sell dialog (used by the contract item).

exports.msk_vehiclekeys:openDialog()

Reading Keys​

RefreshPlayerKeys​

Adds missing permanent keys from the player's owned vehicles.

Parameters
rtn - boolean? - Await and return the result instead of firing async

exports.msk_vehiclekeys:RefreshPlayerKeys()

GetPlayerKeys​

Parameters
playerId - number? - ServerId (self if omitted)

Returns
keys - table

local keys = exports.msk_vehiclekeys:GetPlayerKeys()

for i = 1, #keys do
print(keys[i].plate, keys[i].model, keys[i].type)
end

GetPlayerPrimaryKeys / GetPlayerSecondaryKeys / GetPlayerTempKeys​

Return only the keys of the given type.

local primary = exports.msk_vehiclekeys:GetPlayerPrimaryKeys()
local secondary = exports.msk_vehiclekeys:GetPlayerSecondaryKeys()
local temporary = exports.msk_vehiclekeys:GetPlayerTempKeys()

GetAllVehicleKeys​

Returns the complete key cache of all players.

local allKeys = exports.msk_vehiclekeys:GetAllVehicleKeys()

GetPlayerVehicles​

Returns the player's owned vehicles ({plate, model}).

Parameters
playerId - number? - ServerId (self if omitted)

local vehicles = exports.msk_vehiclekeys:GetPlayerVehicles()

for i = 1, #vehicles do
print(vehicles[i].plate, vehicles[i].model)
end

GetPlayerKeysAndVehicles​

Returns both keys and owned vehicles.

local keys, vehicles = exports.msk_vehiclekeys:GetPlayerKeysAndVehicles()

Key Checks​

HasPlayerKey​

Parameters
vehicle - int - A vehicle handle

Returns
hasKey - boolean

local hasKey = exports.msk_vehiclekeys:HasPlayerKey(vehicle)

HasPlayerPrimaryKey / HasPlayerSecondaryKey / HasPlayerTempKey​

local hasPrimary = exports.msk_vehiclekeys:HasPlayerPrimaryKey(vehicle)
local hasSecondary = exports.msk_vehiclekeys:HasPlayerSecondaryKey(vehicle)
local hasTemp = exports.msk_vehiclekeys:HasPlayerTempKey(vehicle)

IsVehicleOwner​

Parameters
vehicle - int - A vehicle handle

Returns
isOwner - boolean

local isOwner = exports.msk_vehiclekeys:IsVehicleOwner(vehicle)

HasPlayerKeyOrIsVehicleOwner​

Returns true if the player has any key for the vehicle or owns it. Ideal for engine-toggle scripts.

Parameters
vehicle - int - A vehicle handle

Returns
hasKeyOrIsOwner - boolean

local allowed = exports.msk_vehiclekeys:HasPlayerKeyOrIsVehicleOwner(vehicle)

Adding Keys​

Security check on the client path

The client AddKey (and its wrappers) is sent to the server through an event, so primary and secondary keys run through a server-side check: the player can only add such a key for a vehicle they own (stored in owned_vehicles) or already hold a key for (this also covers whitelist and job vehicles). Giving a key to another player additionally requires that player to be nearby and is limited to secondary and temporary keys, you never hand out a primary key that way.

Temporary keys are exempt from the ownership check. They are RAM-only and removed again on the next (re)connect, so the client can add a temporary key for any vehicle, for example a test drive.

To give a player a persistent (primary or secondary) key for a vehicle they do not own, call the server export from a server script. The server export is not restricted.

AddKey​

Parameters
vehicle - int or table - Vehicle handle or {plate, model}
type - string - 'primary', 'secondary' or 'temporary'
playerId - number? - ServerId (self if omitted)

exports.msk_vehiclekeys:AddKey(vehicle, 'secondary')
exports.msk_vehiclekeys:AddKey({plate = vehiclePlate, model = vehicleModel}, 'secondary')

AddPrimaryKey / AddSecondaryKey / AddTempKey​

Convenience wrappers around AddKey.

exports.msk_vehiclekeys:AddPrimaryKey(vehicle)
exports.msk_vehiclekeys:AddPrimaryKey({plate = vehiclePlate, model = vehicleModel})
exports.msk_vehiclekeys:AddSecondaryKey(vehicle)
exports.msk_vehiclekeys:AddTempKey(vehicle)

Removing Keys​

Security check on the client path

A player can always remove their own key. Removing a key from another player requires the caller to own the vehicle. Server scripts are not restricted, see the server export.

RemoveKey​

Parameters
vehicle - int or table - Vehicle handle or {plate, model}
type - string - 'primary', 'secondary' or 'temporary'
playerId - number? - ServerId (self if omitted)

exports.msk_vehiclekeys:RemoveKey(vehicle, 'temporary')

RemovePrimaryKey / RemoveSecondaryKey / RemoveTempKey​

exports.msk_vehiclekeys:RemovePrimaryKey(vehicle)
exports.msk_vehiclekeys:RemovePrimaryKey({plate = vehiclePlate, model = vehicleModel})
exports.msk_vehiclekeys:RemoveSecondaryKey(vehicle)
exports.msk_vehiclekeys:RemoveTempKey(vehicle)

Locks & Transfer​

ExchangeVehicleLocks​

Deletes every key other players have for this vehicle.

Parameters
vehicle - int or table - Vehicle handle or {plate, model}

exports.msk_vehiclekeys:ExchangeVehicleLocks(vehicle)
exports.msk_vehiclekeys:ExchangeVehicleLocks({plate = vehiclePlate, model = vehicleModel})

TransferVehicle​

Transfers a vehicle (including ownership) to another player.

Parameters
targetId - number - ServerId of the target player
vehicle - int or table - Vehicle handle or {plate, model}
showDialog - boolean - Show the price input dialog

exports.msk_vehiclekeys:TransferVehicle(targetId, vehicle, false)
exports.msk_vehiclekeys:TransferVehicle(targetId, {plate = vehiclePlate, model = vehicleModel}, true)

Helpers​

IsVehicleWhitelisted / IsVehicleBlacklisted​

Check a plate/model against Config.Whitelist / Config.Blacklist.

Parameters
plate - string?
model - number?

Returns
result - boolean

local whitelisted = exports.msk_vehiclekeys:IsVehicleWhitelisted(plate, model)
local blacklisted = exports.msk_vehiclekeys:IsVehicleBlacklisted(plate, model)

CloseVehicleDoors​

Closes every open door of a vehicle.

exports.msk_vehiclekeys:CloseVehicleDoors(vehicle)

playLockAnim​

Plays the key-fob animation on the local player.

exports.msk_vehiclekeys:playLockAnim()

playDoorLockEffects​

Plays the lock/unlock sound and indicator flash.

Parameters
vehicle - int - A vehicle handle
state - boolean - true = locked effect, false = unlocked effect

exports.msk_vehiclekeys:playDoorLockEffects(vehicle, true)