Skip to main content

Server Exports

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

Player identification

Functions that act on a player take a playerData table — either {source = playerId} (ServerId) or {identifier = '<identifier>'}. Using the identifier lets you target offline players.

Vehicle data

Key functions take a vehicleData table — {plate, model} for non-spawned vehicles or {netId} for a spawned vehicle's network id.


(Un)locking

toggleLock

Parameters
playerId - number - ServerId of the player
plate - string? - Plate to (un)lock (closest owned vehicle if omitted)
model - number? - Vehicle model

exports.msk_vehiclekeys:toggleLock(playerId, plate)

toggleLockAdmin

(Un)locks a vehicle without needing a key. The player must be Ace-allowed.

exports.msk_vehiclekeys:toggleLockAdmin(playerId, plate)

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

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

local lockStatus = exports.msk_vehiclekeys:GetVehicleLockStatus(vehicle)

:::warning Internal exports SetVehicleLockState and SetVehicleLockStatus exist but are for internal use. Do not call them unless you know exactly what you are doing — they can break the script. :::


Reading Keys

GetPlayerKeys

Parameters
playerData - table - {source} or {identifier}

Returns
keys - table

local keys = exports.msk_vehiclekeys:GetPlayerKeys({source = playerId})

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({source = playerId})
local secondary = exports.msk_vehiclekeys:GetPlayerSecondaryKeys({source = playerId})
local temporary = exports.msk_vehiclekeys:GetPlayerTempKeys({source = playerId})

GetAllVehicleKeys

Returns the complete key cache of all players (keyed by identifier).

local allKeys = exports.msk_vehiclekeys:GetAllVehicleKeys()

GetPlayerVehicles

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

local vehicles = exports.msk_vehiclekeys:GetPlayerVehicles({source = playerId})

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({source = playerId})

RefreshPlayerKeys

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

Parameters
playerId - number - ServerId

Returns
result - table - {owned_keys, added_primary_keys, added_secondary_keys}

local result = exports.msk_vehiclekeys:RefreshPlayerKeys(playerId)

Key Checks

HasPlayerKey

Parameters
playerData - table - {source} or {identifier}
plate - string
model - number

Returns
hasKey - boolean

local hasKey = exports.msk_vehiclekeys:HasPlayerKey({source = playerId}, plate, model)

HasPlayerPrimaryKey / HasPlayerSecondaryKey / HasPlayerTempKey

local hasPrimary = exports.msk_vehiclekeys:HasPlayerPrimaryKey({source = playerId}, plate, model)
local hasSecondary = exports.msk_vehiclekeys:HasPlayerSecondaryKey({source = playerId}, plate, model)
local hasTemp = exports.msk_vehiclekeys:HasPlayerTempKey({source = playerId}, plate, model)

IsVehicleOwner

Parameters
playerData - table - {source} or {identifier}
plate - string

Returns
isOwner - boolean

local isOwner = exports.msk_vehiclekeys:IsVehicleOwner({source = playerId}, plate)

HasPlayerKeyOrIsVehicleOwner

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

Returns
hasKeyOrIsOwner - boolean

local allowed = exports.msk_vehiclekeys:HasPlayerKeyOrIsVehicleOwner({source = playerId}, plate, model)

Adding Keys

AddKey

Parameters
playerData - table - {source} or {identifier}
vehicleData - table - {plate, model, type} or {netId, type}
ignoreInv - boolean? - Skip giving the key item to the inventory

exports.msk_vehiclekeys:AddKey({source = playerId}, {plate = 'LS 1234', model = 1093792632, type = 'secondary'})

AddPrimaryKey / AddSecondaryKey / AddTempKey

Convenience wrappers around AddKey that set the type for you.

exports.msk_vehiclekeys:AddPrimaryKey({source = playerId}, {plate = 'LS 1234', model = 1093792632})

local vehicleNetId = NetworkGetNetworkIdFromEntity(vehicle)
exports.msk_vehiclekeys:AddPrimaryKey({source = playerId}, {netId = vehicleNetId})

exports.msk_vehiclekeys:AddSecondaryKey({source = playerId}, {plate = 'LS 1234', model = 1093792632})
exports.msk_vehiclekeys:AddTempKey({source = playerId}, {plate = 'LS 1234', model = 1093792632})

Removing Keys

RemoveKey

Parameters
playerData - table - {source} or {identifier}
vehicleData - table - {plate, type} or {netId, type}
ignoreInv - boolean? - Skip removing the key item from the inventory

exports.msk_vehiclekeys:RemoveKey({source = playerId}, {plate = 'LS 1234', type = 'secondary'})

RemovePrimaryKey / RemoveSecondaryKey / RemoveTempKey

exports.msk_vehiclekeys:RemovePrimaryKey({source = playerId}, {plate = 'LS 1234', model = 1093792632})
exports.msk_vehiclekeys:RemoveSecondaryKey({source = playerId}, {plate = 'LS 1234'})
exports.msk_vehiclekeys:RemoveTempKey({source = playerId}, {plate = 'LS 1234'})

RemoveAllExistingKeys

Removes every key for a plate, from all players (cache, database and inventory).

Parameters
plate - string

exports.msk_vehiclekeys:RemoveAllExistingKeys('LS 1234')

Locks & Transfer

ExchangeVehicleLocks

Deletes every key other players have for this vehicle (keeps the caller's key).

Parameters
playerData - table - {source} or {identifier}
vehicleData - table - {plate} or {netId} (a plate string is also accepted)

exports.msk_vehiclekeys:ExchangeVehicleLocks({source = playerId}, {plate = 'LS 1234'})

TransferVehicle

Transfers a vehicle (including ownership) from one player to another.

Parameters
ownerData - table - {source} or {identifier}
targetData - table - {source} or {identifier}
vehicleData - table - {plate, model} or {netId}

exports.msk_vehiclekeys:TransferVehicle({source = playerId}, {source = targetId}, {plate = 'LS 1234', model = 1093792632})

ChangeNumberPlate

Changes the plate of all existing keys. Optionally also updates the SQL owned_vehicles table.

Parameters
oldPlate - string
newPlate - string
changeSQL - boolean - Also update the SQL table — default false

exports.msk_vehiclekeys:ChangeNumberPlate("ABC 123", "XYZ 789", true)
exports.msk_vehiclekeys:ChangeNumberPlate("ABC 123", "XYZ 789", false)

Vehicle Checks & 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)

IsAdminVehicle

Returns true if the plate/model is configured in Config.AdminVehicles.

local isAdminVehicle = exports.msk_vehiclekeys:IsAdminVehicle(plate, model)

IsAdminVehicleAllowed

Returns true if the player is Ace-allowed and the vehicle is an admin vehicle.

Parameters
playerId - number - ServerId
plate - string?
model - number?

local allowed = exports.msk_vehiclekeys:IsAdminVehicleAllowed(playerId, plate, model)

IsJobVehicle

Returns true if a job (and optionally rank) may (un)lock the given vehicle — checks both society_<job> owned vehicles and Config.JobVehicles.

Parameters
jobName - string
jobRank - string
plate - string?
model - number?

local isJobVehicle = exports.msk_vehiclekeys:IsJobVehicle('police', 'officer', plate, model)

GetOwnedVehiclesInRadius

Returns all spawned vehicles in radius the player is allowed to (un)lock (keys, job, whitelist or admin).

Parameters
playerId - number - ServerId
playerCoords - vector3
radius - number

local vehicles = exports.msk_vehiclekeys:GetOwnedVehiclesInRadius(playerId, playerCoords, 8.0)

GetClosestPlayer / GetClosestVehicle / GetClosestVehicleWithPlate

local ped = exports.msk_vehiclekeys:GetClosestPlayer(coords, players)
local vehicle = exports.msk_vehiclekeys:GetClosestVehicle(coords, vehicles)
local vehicle = exports.msk_vehiclekeys:GetClosestVehicleWithPlate(coords, distance, plate, vehicles)

IsVehicleOwned / GetVehiclesInBucket

-- IsVehicleOwned checks the owned-vehicles table for a plate (source is unused)
local isOwned = exports.msk_vehiclekeys:IsVehicleOwned(playerId, plate)
local vehicles = exports.msk_vehiclekeys:GetVehiclesInBucket(bucketId)

hasCorrectItem / AddKeyToInv / RemoveKeyFromInv

Inventory helpers for the key item (including keyring).

local hasItem = exports.msk_vehiclekeys:hasCorrectItem({source = playerId}, Config.Settings.key, plate)
exports.msk_vehiclekeys:AddKeyToInv({source = playerId}, plate, 'primary')
exports.msk_vehiclekeys:RemoveKeyFromInv({source = playerId}, plate)