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)
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
force - boolean (optional) - true re-adds all missing key items to the player's inventory, regardless of the Config.OnRefreshKeys flags (added in v3.0.0)

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

local result = exports.msk_vehiclekeys:RefreshPlayerKeys(playerId)

-- FORCE: re-add every missing key item to the inventory
local result = exports.msk_vehiclekeys:RefreshPlayerKeys(playerId, true)

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

Not restricted

The server AddKey adds the key directly and does not run the ownership check that the client path uses. Use it from your server scripts to hand out keys for any vehicle, including job, rental or shop vehicles the player does not own in owned_vehicles.

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)