Server Exports
All server exports are called via exports.msk_vehiclekeys:<name>(...).
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.
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)
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
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)